[英]Why JUnit test methods need to be void?
我已经阅读了很多地方,测试方法应该/必须是void
,但没有人说这是什么原因。
我在MethodValidator中找到了没有comments / javadocs的以下检查。
if (each.getReturnType() != Void.TYPE) {
errors.add(new Exception("Method " + each.getName()
+ " should be void"));
}
那为什么它应该是void
?
问你相反的问题:为什么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
之外的其他东西真的没有价值。
这纯粹是一种设计选择。 JUnit不知道你的代码,所以如果你的方法会返回一些内容,它就无法做任何事情。
因此要么丢弃返回值,要么使用“void”方法。 作者选择了后一种选择 - 你可以认为这稍微好一点,因为它不会让读者感到困惑。
请注意,非@Test方法可以随意执行任何操作 - 它们没有此限制。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.