我在很多地方都读到测试方法应该/必须是void
,但是没有人说这是什么原因。
我在MethodValidator中发现了以下没有注释/ javadocs的检查。
if (each.getReturnType() != Void.TYPE) {
errors.add(new Exception("Method " + each.getName()
+ " should be void"));
}
那为什么要void
呢?
答案 0 :(得分:5)
问您一个相反的问题:为什么JUnit测试方法不必是void
?
没有理由:因为测试方法的设计目的不是返回将由客户端类利用的结果。
单元测试的目的是验证某些断言。测试运行程序调用测试方法,并且该运行程序解释在执行测试以产生测试结果时抛出的任何断言失败或任何异常。
我们可能想知道为什么测试不返回断言结果。
但这不是一个好主意,因为编写单元测试非常麻烦:
@Test
public AssertionResult foo(){
Bar actualBar = foo.doThat(...);
if (actualBar == null){
return AssertionResult.fail("actualBar == null");
}
}
写这样的东西真的很容易理解:
@Test
public void foo(){
Bar actualBar = foo.doThat(...);
Assert.assertNotNull(actualBar);
}
我们还想知道为什么测试方法不能被其他测试方法调用,例如:
@Test
public int foo(){
Bar actualBar = foo.doThat(...);
//...
return intValue;
}
@Test
public void fooWithComputedInt(){
Bar actualBar = foo.doThat(foo());
//...
}
但这也不是一个好主意,因为它会耦合测试执行,而单元测试执行必须与其他测试隔离。而且,这还会使测试多次执行,并且必须尽快执行单元测试。
因此,使测试方法返回void
之外的其他东西真的没有任何价值。
答案 1 :(得分:1)
这纯粹是设计选择。 JUnit不了解您的代码,因此如果您的方法将返回某些内容,它将无法执行任何操作。
因此它应该丢弃返回值,或者要求您使用“ void”方法。作者选择了后一种方法-您可以说这稍微好一点,因为它不会使读者感到困惑。
请注意,非@Test方法可以自由地执行所需的任何操作-它们没有此限制。