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

时间:2015-01-09 09:47:45

标签: java unit-testing junit guava

我使用Guava的Preconditions来验证我方法的输入,例如:

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);
} 

3 个答案:

答案 0 :(得分:5)

我的意见是,您通常应该使用测试来验证方法的行为是否与其合同指定的行为相匹配(包括前置条件)。如果你说你的方法在给出参数的负值时抛出某个异常,那么进行一次测试以确保它是真的。

对于像NullPointerException这样的常见内容,guava-testlibNullPointerTester,我们用它来测试NPE是否为{{1}未注释的参数抛出}}

答案 1 :(得分:4)

要提出相反的论点(并且围绕着'它取决于'),检查前提条件的方式是一个实现细节,事实是你想要的行为就是如果违反前提条件,则抛出异常。鉴于此,我认为您应该在测试中检查这些条件,因为您的测试应该验证行为是否符合您的预期。

话虽如此,我认为这取决于先决条件的检查内容以及它们的应用方式。如果要将注释应用于整个包,以便不允许传递空值,那么对我来说没有意义,然后检查每个方法的测试。

但是在您的示例中,您正在检查sqrt函数中的特定内容,并且您正在使用特定技术检查的事实是,恕我直言,无关紧要,您应该测试它以验证方法的行为。

答案 2 :(得分:2)

我认为你们大多会在这里得到意见,但我会说这通常不值得花时间。如果您有8个参数都进行了前置条件检查怎么办?如果需要7/8,您想测试所有参数组合吗?我希望文档具体使用Optional<>类型或使用@Nullable@Nonnull类型注释来帮助自我记录代码。

我喜欢Guava的做法,annotates the whole package @ParametersAreNonnullByDefault

@ParametersAreNonnullByDefault
package com.google.common.base;