繁体   English   中英

方法前提条件是否应进行单元测试?

[英]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-testlibNullPointerTester ,我们用它来测试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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM