Java JUnit测试具有多个可接受答案

Java JUnit测试具有多个可接受答案,java,junit,junit4,assert,Java,Junit,Junit4,Assert,在JUnit测试中是否可能有多个被接受的答案?例如: Main rock = new Main(); Assert.assertEquals("y", boxes("23")); 因此,对于这个测试,我希望能够接受结果字符串“y”或“n”作为可接受的答案,这可能吗?您可以这样做,但不能使用assertEquals()。尝试以下方法: Assert.assertTrue(boxes("23").equals("y") || boxes("23").equals("n")); 如果您

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

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

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

您可以这样做,但不能使用
assertEquals()
。尝试以下方法:

Assert.assertTrue(boxes("23").equals("y") || boxes("23").equals("n"));
如果您有多个可能的答案,则设置
可能更容易

Set<String> possibleAnswers = new HashSet<>();
possibleAnswers.add("y");
possibleAnswers.add("n");
...

Assert.assertTrue(possibleAnswers.contains(boxes("23")));
Set possibleAnswers=new HashSet();
可能的答案。添加(“y”);
可能的回答。添加(“n”);
...
Assert.assertTrue(可能的答案包含(框(“23”));

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


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

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

接受多个答案的一种解释是,assert方法是从多个测试调用的,这些测试只断言结果的一个泛型属性。通用属性可以更轻松地进行测试。

擅长于此

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

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

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

是否有任何导入文件?我收到一个“无法解析方法”错误,您正在使用哪个junit版本。如果小于4.4,则使用assertj,如果无法满足预期,truth或hamcrest将生成更好的消息。建议的解决方案失败得很糟糕,因为“预期为true,但为false”
import static org.assertj.core.api.Assertions.assertThat;

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