在JUnit测试中是否可以有多个已接受的答案?例如:
Main rock = new Main();
Assert.assertEquals("y", boxes("23"));
因此,对于此测试,我希望能够接受结果字符串" y"或" n"作为一个可接受的答案,这可能吗?
答案 0 :(得分:2)
您可以这样做,但不能使用assertEquals()
。尝试类似:
Assert.assertTrue(boxes("23").equals("y") || boxes("23").equals("n"));
如果您有多个可能的答案,Set
可能会更容易。
Set<String> possibleAnswers = new HashSet<>();
possibleAnswers.add("y");
possibleAnswers.add("n");
...
Assert.assertTrue(possibleAnswers.contains(boxes("23")));
答案 1 :(得分:2)
使用Hamcrest CoreMatcher(包含在JUnit 4.4及更高版本中)和assertThat():
Assert.assertThat(boxes("23"), anyOf(is("y"), is("n"));
答案 2 :(得分:1)
Assertj擅长这一点。
import static org.assertj.core.api.Assertions.assertThat;
assertThat(boxes("23")).isIn("y", "n);
与hamcrest相比,assertj的大优点是易于使用代码完成。
答案 3 :(得分:0)
除了有可能(例如参见@dev)这被认为是一种不好的做法。
在同一输入上返回不同结果的方法必须(!)包含非确定性的来源。要解决这个问题 - 正确地模拟它,只会有一个结果。
接受多个答案的解释可能是断言方法是从多个测试中调用的,只是断言结果的泛型属性。使用Junit Theories可以更舒适地测试通用属性。