Assert包含jUnit中的字符串


186

有没有更好的方法来编写jUnit

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

7
海事组织,这已经足够好,建议的选项不太可读
The Godfather

3
@TheGodfather可读性较差,但会产生更有意义的断言错误(即,接受的响应将显示字符串中的差异,其中,OPs解决方案将在失败时仅显示“ False when Expected True”)
Mike

使断言“ nicer”失效的是错误消息。它在代码中的可读性是次要的,因为在代码失败之前您不必查看代码,而失败消息是您首先看到的内容。
rjmunro

Answers:


290

如果添加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.Assertvs junit.framework.Assert,因为后者没有Hamcrest MatcherassertThat()
Visionary Software Solutions

15
我认为在运行JUnit 4.10时,要使用的类是org.junit.matchers.JUnitMatchers,例如:assertThat(“ something”,JUnitMatchers.containsString(“ some”));
Ewen Cartwright

1
失败的失败消息assertThat比然后更有用assertTrue
Mike Rylander 2013年

3
静态导入需要import static org.junit.Assert.assertThat; import static org.hamcrest.CoreMatchers.containsString;-只是为了使某人免于麻烦
2013年

4
...以及org.hamcrest.Matchers.containsString;最新的api中的hamcrest-library依赖项。
2013年

13

尽可能使用fest assert 2.0编辑:assertj可能有更多断言(分支)

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

我没有用AssertJ.assertThat找到一个contains方法。这是我发现的-org.assertj.core.api.Assertions.assertThat(conversionException).hasMessageContaining(“ some substring”);
拉吉

抱歉,我的上述评论不适合此答案的内容。我在另一个用例中,需要检查异常消息中的子字符串。
拉吉

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还有其他一些有趣的匹配器,例如StartWithContains等等。



0

示例(简化版-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

因此,我决定使用问题中提到的简单可行的方法,而不是编写可读的代码。

希望会出现另一个解决方案。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.