[英]Should method preconditions be unit tested?
我使用Guava的前置条件来验证我的方法的输入,例如:
class TestedClass {
public double sqrt(double value) {
Preconditions.checkArgument(value >= 0.0, "negative value: %s", value);
}
}
我想知道前提条件是否应进行单元测试? 我应该测试一下:
@Rule
public ExpectedException exception = ExpectedException.none();
@Test
public void shouldFailWhenValueIsNegative() {
exception.thown(IllegalArgumentException.class);
exception.expectMessage("negative value: -1");
new TestedClass().sqrt(-1);
}
我的意见是,您通常应该使用测试来验证方法的行为是否与其合同(包括前置条件)指定的行为相匹配。 如果你说你的方法在给出参数的负值时抛出某个异常,那么进行一次测试以确保它是真的。
对于像NullPointerException
这样非常常见的事情, guava-testlib
有NullPointerTester
,我们用它来测试NPE
是否为未使用@Nullable
注释的参数抛出。
为了提出相反的参数(并且用'It depends'坐在栅栏上),检查前置条件的方式是一个实现细节,事实是你想要的行为是如果违反了前提条件则抛出异常。 鉴于此,我认为您应该在测试中检查这些条件,因为您的测试应该验证行为是否符合您的预期。
话虽如此,我认为这取决于前提条件的检查内容以及它们的应用方式。 如果要将注释应用于整个包,以便不允许传递空值,那么对我来说检查每个方法的测试是没有意义的。
但是在您的示例中,您正在检查sqrt函数中的特定内容,并且您使用特定技术检查的事实是,恕我直言,无关紧要,您应该测试它以验证方法的行为。
我认为你们大多会在这里得到意见,但我会说这通常不值得花时间。 如果您有8个参数都进行了前置条件检查怎么办? 如果需要7/8,您想测试所有参数组合吗? 我希望文档具体使用Optional<>
类型或使用@Nullable
或@Nonnull
类型注释来帮助自我记录代码。
我喜欢Guava的方式,它用@ParametersAreNonnullByDefault
注释整个包
@ParametersAreNonnullByDefault
package com.google.common.base;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.