好的,我知道这被认为是一种反模式,我当然愿意接受更好的方式。
我有一个枚举值的地图。我想确保将每个枚举值分配给某些东西。我的测试看起来像这样。
@Test
public void eachRowRequiresCellCalc()
{
Model model = new Model();
EnumValues[] values = EnumValues.values();
for (EnumValues value : values)
{
Assert.assertTrue(String.format("%s must be assigned", value.name()), model.hasEnumValue(value));
}
}
这可以实现并完成我正在寻找的90%。它没有做的是告诉我多个枚举值是否未分配(它在第一个失败)。有没有办法让JUnit每次测试都有多个失败?
答案 0 :(得分:1)
理想情况下,一旦出现故障,您就不希望检查所有值,因为它总是会失败。
但我会建议一种解决方法,但不确定它是否适合你:
@Test
public void eachRowRequiresCellCalc()
{
Model model = new Model();
EnumValues[] values = EnumValues.values();
List<EnumValues> isFalse = new ArrayList<EnumValues>;
for (EnumValues value : values)
{
if(!model.hasEnumValue(value)) {
isFalse.add(value);
}
}
//Now you have the array of incorrect values in 'isFalse'
}
答案 1 :(得分:1)
每次测试不能有多次失败。但是你可以通过跟踪for循环中的失败来做类似的事情。然后在for循环外面打印出一个断言中的字符串。
@Test
public void eachRowRequiresCellCalc()
{
Model model = new Model();
EnumValues[] values = EnumValues.values();
String errors = "";
for (EnumValues value : values)
{
if(!model.hasEnumValue(value))
errors += String.format("%s must be assigned", value.name()+". ");
}
if(!errors.isEmpty()){
fail(errors);
}
}
答案 2 :(得分:1)
使用junit-quickcheck表达这一点的方法是:
@RunWith(Theories.class)
public class Models {
@Theory public void mustHaveValue(@ForAll @ValuesOf EnumValues e) {
assertTrue(e.name(), new Model().hasEnumValue(e));
}
}
这将为你的枚举的每个值运行理论方法。
另一种表达方式是通过parameterized test。
(完全披露:我是junit-quickcheck的创建者。)
答案 3 :(得分:0)
我知道你问过JUnit,但是如果你能够考虑TestNG,你可以将方法定义为@DataProvider,它将为@Test方法提供参数。你似乎正在寻找的东西非常适合。
另一个想到的选择是你可能想要查看MatcherAssert.assert与集合匹配器。此外,它还可以更好地记录您的断言 - 您可能不需要使用字符串格式。
关于单元测试的建议,如果你不介意:如果你把一个测试方法制成一个给定的 - 当时 - 那个部分的块,它会大大提高它们的可读性。给出设置测试用例(变量,模拟等),当执行正在测试的方法时,则是检查结果的部分(断言,验证,...)。我发现遵循这个结构可以帮助其他人以及我自己在测试完成后的几周内了解正在发生的事情。
答案 4 :(得分:0)
我知道这是一个比较老的问题,但是对于像我一样偶然发现它的任何人-到今天为止,JUnit提供了一个assertAll()
函数,该函数可以用于此目的,因此没有还有更多的工作要弄乱尝试获取多个链式断言的结果:)
这里是the reference,希望这可以节省您一些时间!如果我较早知道的话,肯定可以保存一些。