具有多个已接受答案的 JUnit 测试

JUnit Test With More than One Accepted Answer

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

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

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

你可以做到,但 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")));

使用 Hamcrest CoreMatcher(包含在 JUnit 4.4 及更高版本中)和 assertThat():

Assert.assertThat(boxes("23"), anyOf(is("y"), is("n"));

除了可能(例如,参见@dev)之外,它被认为是一种不好的做法。

在同一输入上返回不同结果的方法必须(!)包含不确定性来源。要解决这个问题 - 正确地模拟它并且只会有一个结果。

接受多个答案的解释可能是从多个测试调用断言方法只是断言结果的通用 属性。使用 Junit Theories.

可以更轻松地测试通用属性

Assertj擅长这个

import static org.assertj.core.api.Assertions.assertThat;

    assertThat(boxes("23")).isIn("y", "n);

与 hamcrest 相比,assertj 的一大优点是易于使用代码完成。