JUnit测试有多个接受的答案

时间:2017-09-21 03:31:32

标签: java junit junit4 assert

在JUnit测试中是否可以有多个已接受的答案?例如:

   Main rock = new Main();
   Assert.assertEquals("y", boxes("23"));

因此,对于此测试,我希望能够接受结果字符串" y"或" n"作为一个可接受的答案,这可能吗?

4 个答案:

答案 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可以更舒适地测试通用属性。