有没有更好的方法来编写jUnit测试用例?
String x = "foo bar";
Assert.assertTrue(x.contains("foo"));
如果你加入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;
org.junit.Assert
而不是 junit.framework.Assert
,因为后者没有 Hamcrest Matcher 的 assertThat()
方法。 - Visionary Software SolutionsassertThat
的失败信息比一个 assertTrue
更有帮助。 - Mike Rylanderimport static org.junit.Assert.assertThat; import static org.hamcrest.CoreMatchers.containsString;
- 只是为了避免给某人带来麻烦。 - eishamcrest-library
依赖项中包含org.hamcrest.Matchers.containsString;
。 - eis尽可能使用 fest assert 2.0,编辑: assertj 可能有更多的断言(一个分支)
assertThat(x).contains("foo");
使用 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"
我已将我的答案发布在一个重复的问题这里
你可以使用 assertj 来进行流畅的断言。它有很多能力,可以以更加易读的方式编写断言,让用户更容易理解。
在你的情况下,可以这样做:
String x = "foo bar";
assertThat(x).contains("foo");
它不仅适用于字符串,还可以以更友好的方式断言列表、集合等等。
示例 (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");
}
}
虽然有点晚了,但是为了更新一下,我使用以下语法完成了它。
import org.hamcrest.core.StringContains;
import org.junit.Assert;
Assert.assertThat("this contains test", StringContains.containsString("test"));
Assert.assertThat(actual, new Matches(expectedRegex));
org.mockito.internal.matchers
中还有一些其他有趣的匹配器,例如StartWith
,Contains
等。import org.assertj.core.api.Assertions;
Assertions.assertThat(actualStr).contains(subStr);
我写了这个实用方法
public static void assertContains(String string, String subString) {
Assertions.assertTrue(string.contains(subString));
}
Assert.assertTrue("应该包含子字符串 'foo'", x.contains("foo"));
。 - rook218