221

有没有更好的方法在 jUnit 中编写

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

10 回答 10

341

如果你添加 Hamcrest 和 JUnit4,你可以这样做:

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

使用一些静态导入,它看起来好多了:

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

所需的静态导入将是:

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.CoreMatchers.containsString;
于 2009-07-07T13:05:52.453 回答
17

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

assertThat(x).contains("foo");
于 2012-12-08T12:05:33.843 回答
11

使用 hamcrest MatchercontainsString()

// 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"

在这里发布了我对重复问题的回答

于 2013-08-28T22:33:46.680 回答
5

将新assertThat语法与Hamcrest一起使用。

它从JUnit 4.4开始可用。

于 2009-07-07T13:04:54.513 回答
5

为时已晚,但只是为了更新我用下面的语法完成了

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

Assert.assertThat("this contains test", StringContains.containsString("test"));
于 2019-07-15T04:30:31.380 回答
5

您可以使用assertj -fluent 断言。它有很多功能可以以更易于阅读的方式编写断言 - 用户友好的方式。

在你的情况下,这将是

 String x = "foo bar";
 assertThat(x).contains("foo");

It is not only for the strings, it can be used to assert lists, collections etc.. in a friendlier way

于 2020-10-21T14:56:23.527 回答
3

示例(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");
 }

}
于 2020-05-31T11:16:59.143 回答
2

另一种变体是

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

此外,org.mockito.internal.matchers还有一些其他有趣的匹配器,例如StartWithContains

于 2016-05-13T13:53:11.543 回答
1

assertj 变体

import org.assertj.core.api.Assertions;
Assertions.assertThat(actualStr).contains(subStr);
于 2020-05-27T07:42:20.270 回答
0

我在这个页面上尝试了很多答案,没有一个真正奏效:

  • org.hamcrest.CoreMatchers.containsString无法编译,无法解析方法。
  • JUnitMatchers.containsString已被贬低(并引用CoreMatchers.containsString)。
  • org.hamcrest.Matchers.containsString:NoSuchMethodError

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

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

于 2016-11-19T14:00:22.397 回答