ChatGPT解决这个技术问题 Extra ChatGPT

AssertContains 在 jUnit 中的字符串上

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

String x = "foo bar";
Assert.assertTrue(x.contains("foo"));
IMO 这已经足够好了,建议的选项可读性较差
@TheGodfather 可读性较差,但会产生更有意义的断言错误(即,接受的响应将显示字符串的差异,而 OPs 解决方案在失败时只会显示“预期为真时为假”)
使断言“更好”的是它失败时的错误消息。它在代码中的可读性是次要的,因为在代码失败之前您不必查看代码,而失败消息是您看到的第一件事。
问题本身应该是公认的答案:D

m
masterxilo

如果你添加 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.Assertjunit.framework.Assert,因为后者没有 Hamcrest Matcher assertThat()
我认为在运行 JUnit 4.10 时,要使用的类是 org.junit.matchers.JUnitMatchers,例如:assertThat("something", JUnitMatchers.containsString("some"));
失败 assertThat 的失败消息比 assertTrue 更有帮助
需要的静态导入是 import static org.junit.Assert.assertThat; import static org.hamcrest.CoreMatchers.containsString; - 只是为了让某人免于麻烦
... 和 org.hamcrest.Matchers.containsString; 在最新的 api 中,在 hamcrest-library 依赖项中。
p
piotrek

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

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

我没有找到带有 AssertJ.assertThat 的 contains 方法。这就是我发现的 - org.assertj.core.api.Assertions.assertThat(conversionException).hasMessageContaining("some substring");
抱歉,我认为我的上述评论不适合此答案的上下文。我在一个不同的用例中,我需要检查异常消息中的子字符串。
C
Community

使用 hamcrest 匹配器 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"

发布了我对重复问题的回答here


R
Robert Munteanu

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

它从 JUnit 4.4 开始可用。


r
rns

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

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

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

u
user2739602

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

在你的情况下,这将是

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

它不仅适用于字符串,还可以用于以更友好的方式断言列表、集合等


M
Muriithi Derrick

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

}

这应该是公认的答案。最简单且有效
谢谢@ajpieri。
L
LEON DENIS

另一种变体是

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

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


L
Lazarenko Alex

assertj 变体

import org.assertj.core.api.Assertions;
Assertions.assertThat(actualStr).contains(subStr);

P
P Kuijpers

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

org.hamcrest.CoreMatchers.containsString 无法编译,无法解析方法。

JUnitMatchers.containsString 已被贬低(并引用 CoreMatchers.containsString)。

org.hamcrest.Matchers.containsString:NoSuchMethodError

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

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