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.