AssertjUnit의 문자열에 포함


187

jUnit으로 작성하는 더 좋은 방법이 있습니까

String x = "foo bar";
Assert.assertTrue(x.contains("foo"));

7
IMO 이것은 충분히 훌륭하고 제안 된 옵션은 읽기
대부

3
@TheGodfather 가독성이 떨어지지 만보다 의미있는 어설 션 오류가 발생합니다 (예 : 수락 된 응답에 따라 문자열의 차이가 표시됩니다. 여기서 OP의 솔루션은 "실제로 예상되는 경우 거짓"으로 표시됨)
Mike

어설 션 "nicer"를 만드는 것은 실패 할 때 발생하는 오류 메시지입니다. 코드에서 코드를 읽을 수있는 방법은 코드가 실패 할 때까지 코드를 볼 필요가 없으므로 오류 메시지가 가장 먼저 보이므로이 코드에 비해 부차적입니다.
rjmunro

답변:


291

Hamcrest 및 JUnit4를 추가하면 다음을 수행 할 수 있습니다.

String x = "foo bar";
Assert.assertThat(x, CoreMatchers.containsString("foo"));

일부 정적 가져 오기를 사용하면 훨씬 좋아 보입니다.

assertThat(x, containsString("foo"));

필요한 정적 가져 오기는 다음과 같습니다.

import static org.junit.Assert.assertThat;
import static org.hamcrest.CoreMatchers.containsString;

8
당신이 사용하는 수 org.junit.Assert에 비해 junit.framework.Assert후자로 Hamcrest Matcher를 가지고 있지 않습니다assertThat()
비전 소프트웨어 솔루션

15
JUnit 4.10을 실행할 때 사용할 클래스는 org.junit.matchers.JUnitMatchers입니다. 예 : assertThat ( "something", JUnitMatchers.containsString ( "some"));
Ewen Cartwright

1
낙제에 대한 오류 메시지는 assertThat다음 방법이 더 도움이된다assertTrue
마이크 Rylander

3
정적 인 수입품은 import static org.junit.Assert.assertThat; import static org.hamcrest.CoreMatchers.containsString;누군가를 곤란에서 구하기 위해
eis

4
... 그리고 org.hamcrest.Matchers.containsString;최신 API에서 hamcrest-library종속성.
eis

13

가능하면 fest assert 2.0 사용 편집 : assertj에 더 많은 어설 션이있을 수 있습니다 (포크)

assertThat(x).contains("foo");

AssertJ.assertThat에 포함 메소드를 찾지 못했습니다. 이것이 내가 대신 찾은 것입니다-org.assertj.core.api.Assertions.assertThat (conversionException) .hasMessageContaining ( "some substring");
Raj

죄송합니다. 위의 의견이이 답변의 내용에 적합하지 않다고 생각합니다. 예외 메시지 내에서 하위 문자열을 확인 해야하는 다른 유스 케이스에있었습니다.
Raj

8

hamcrest matcher 사용 containsString()

// Hamcrest assertion
assertThat(person.getName(), containsString("myName"));

// Error Message
java.lang.AssertionError:
Expected: a string containing "myName"
     got: "some other name"

더 자세한 오류 메시지를 선택적으로 추가 할 수 있습니다.

// Hamcrest assertion with custom error message
assertThat("my error message", person.getName(), containsString("myName"));

// Error Message
java.lang.AssertionError: my error message
Expected: a string containing "myName"
     got: "some other name"

중복 질문에 대한 답변을 여기에 게시 했습니다.



3

너무 늦었지만 업데이트하기 위해 아래 구문으로 완료했습니다.

import org.hamcrest.core.StringContains;
import org.junit.Assert;

Assert.assertThat("this contains test", StringContains.containsString("test"));

2

다른 변형은

Assert.assertThat(actual, new Matches(expectedRegex));

또한에 org.mockito.internal.matchers다른 흥미로운 매처 (matcher), 같은있다 StartWith, Contains



0

예 (Junit 버전-4.13)

import static org.assertj.core.api.Assertions.assertThat;
import org.junit.Test;

public class TestStr {

@Test
public void testThatStringIsContained(){
    String testStr = "hi,i am a test string";
    assertThat(testStr).contains("test");
 }

}

-1

이 페이지에서 많은 답변을 시도했지만 실제로 효과가 없었습니다.

  • org.hamcrest.CoreMatchers.containsString 이 컴파일되지 않고 메소드를 분석 할 수 없습니다.
  • JUnitMatchers.containsString 은 지원되지 않으며 CoreMatchers.containsString을 참조합니다.
  • org.hamcrest.Matchers.containsString : NoSuchMethodError

그래서 읽을 수있는 코드를 작성하는 대신 질문에서 언급 된 간단하고 실행 가능한 접근 방식을 대신 사용하기로 결정했습니다.

바라건대 다른 해결책이 나올 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.