Java Junit如何检查字符串是否等于两个字符串中的一个?

Java Junit如何检查字符串是否等于两个字符串中的一个?,java,junit,Java,Junit,这似乎是一个超级简单的问题,但我就是想不出来 我只是想断言字符串等于“string1”或“string2” 这是我尝试过的,但两种方法显然都不起作用 assertEquals(d.getFormType(), "string1") || assertEquals(d.getFormType(), "string2"); assertEquals(d.getFormType(), "string1" || "string2"); 您可以使用assertTrue(): 或使用扩展版本在发生故障时

这似乎是一个超级简单的问题,但我就是想不出来

我只是想断言字符串等于“string1”或“string2”

这是我尝试过的,但两种方法显然都不起作用

assertEquals(d.getFormType(), "string1") || assertEquals(d.getFormType(), "string2");

assertEquals(d.getFormType(), "string1" || "string2");

您可以使用
assertTrue()

或使用扩展版本在发生故障时提供更多信息:

assertTrue("Unexpected value for d.getFormType(): " + d.getFormType(),
           d.getFormType().equals("string1") ||
           d.getFormType().equals("string2"));

断言类没有一种直接的方法来执行您想要的操作。但您始终可以返回到
assertTrue
并检查您想要的任何条件

assertTrue("string1".equals(d.getFormType()) || "string2".equals(d.getFormType()))

我不知道有哪种JUnit风格可以做到这一点,但我会做一些更简单的工作:

boolean stringEquals = false;
if ("string1".equals(d.getFormType()) || "string2".equals(d.getFormType())) {
    stringEquals = true;
}
assertTrue(stringEquals);

你的问题没有道理。单元测试总是有相同的结果——它们不是随机的,或者更确切地说,它们不应该是随机的。这就是为什么JUnit不支持交替结果

试着找到一种方法来设置测试,使输出不会改变

如果这真的不可能,那么您的代码或至少其设计可能有问题

试着解决这个问题

如果您确实不能,那么您可以使用:

boolean valid = ....some complex check...
assertTrue( valid );
[EDIT]要同时测试多个值,可以使用以下技巧:

String[] values = ...;
assertEquals( "0:...\n1:...",  "0:" + values[0] + "\n" + "1:" + values[1] ... );
i、 e.将所有值放入一个长字符串中,然后检查整个字符串。大多数IDE将在两个文本编辑器中并排显示差异,因此任何不匹配都很容易看到+文本中的小提示(
0:
,…)将告诉您错误的确切位置。

我建议您使用Hamcrest匹配器。它们通过
assertThat()
集成到JUnit中,但您也需要下载和安装

使用Hamcrest,您可以像这样解决问题:

import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;

assertThat(d.getFormType(), isOneOf("string1", "string2"));
如果无法安装Hamcrest,另一种选择是使用正则表达式:

assertTrue(d.getFormType().matches("(string1|string2)"));
这比组合两个
equals()
语句更短,也更具可读性:

String actual = d.getFormType();
assertTrue("string1".equals(actual) || "string2".equals(actual));
怎么样

Assert.assertTrue("msg", Arrays.asList("string1", "string2").contains(searchString));

如果msg失败,我会将其更新为友好消息。

我想测试此输出,因为我传入了一个逗号分隔的字符串,并用逗号将其拆分。我想测试我的方法是否能够正确地处理逗号分隔的字符串。然后,它的意义就更小了。它应始终返回相同的值。您需要的是
,而不是
。看我的编辑。不,你错了。我正在设置一个字符串
string1,string2
。在我的方法中,我将该字符串拆分,并对
string1
string2
进行搜索,然后将结果放在一起并返回它们。因此,我想通过junit测试验证表单类型是string1还是string2。有意义吗?没有。这闻起来像是集成测试:你测试太多了。试着把这个方法分成更小的部分,这样你就可以独立于其他部分来测试“分割逗号分隔值”。我希望有人能发布一个匹配器的例子。我看了这个,但没有弄明白。是的,它们工作得非常好,当它们不匹配时,会给出很好的诊断消息。当尝试导入org.hamcrest.Matchers.*时,它无法解决,因此isOneOf不起作用。我使用的是JUnit4.10抱歉,您需要单独下载并安装Hamcrest jar。JUnit附带了最简单的Hamcrest轮廓-只足以支持集成。好的,明白了。感谢您的提示。第二个代码倾向于NPE,并且由于该方法始终返回两个可能值中的一个,因此消息可能包含与测试结果不同的字符串。@Aarondigula,请参阅关于NPE的此问题的公认答案:。至于参数值的改变,这只是你的猜测。该方法似乎是一个查询方法,无论调用的频率如何,都应该返回相同的值(没有调用任何中间的对象修改方法,这里不是这种情况)。早期NPE的问题是,它经常在一长行代码中留下错误,并且不知道50个位置中的哪一个导致了NPE。这里,
assertTrue()
会告诉您,如果
result
能够达到这样的效果,那么它是空的。Hamcrest做得更好,因为断言简短易读,并且在失败时提供诊断。请看@aetheria的答案。这很好。它很容易阅读,并且可以绕过NPE问题。
Assert.assertTrue("msg", Arrays.asList("string1", "string2").contains(searchString));