为什么这个FindBugs警告没有被抑制?

时间:2014-09-21 23:22:47

标签: java eclipse gradle findbugs

我正在尝试在我的一个单元测试中抑制FindBugs警告:

@SuppressFBWarnings(value = "DMI_DOH",
                    justification = "It's sensical when declaring expectations.")
@Test
public void ctor_checksForNullArguments() {
    new Expectations(Preconditions.class) {
        {
            Preconditions.checkNotNull("DUMMY");   // D'oh! A nonsensical invocation…
            this.result = "DUMMY";

            Preconditions.checkNotNull("(dummy)"); // D'oh! A nonsensical invocation…
            this.result = "(dummy)";
        }
    };

    new InfixSymbolTest.DummySymbol();
}

我只能假设我这样做不正确,因为仍然通过Eclipse功能和Gradle插件报告警告。帮助

  • JDK:1.7.0_51
  • Eclipse:4.3.1
  • Eclipse的FindBugs功能:2.0.3
  • Gradle:1.12
  • FindBugs注释:2.0.3
  • JUnit:4.11
  • JMockit:1.12

1 个答案:

答案 0 :(得分:2)

以下代码创建匿名内部类

new Expectations(Preconditions.class) {
    // ...
};

Preconditions.checkNotNull的调用和this.result的分配发生在匿名内部类中作用域的初始化程序块中。为了使@SuppressFBWarnings注释适用于这些语句,注释必须至少放在包含它们的类上。

虽然匿名内部类及其语句的源代码是在ctor_checksForNullArguments测试方法中物理编写的,但生成的字节码实际上并不是测试类的一部分,也不是方法,因此将注释放在方法上会将其应用到错误的范围。

由于任何匿名内部类都可以提取到命名(非匿名)内部类甚至是顶级类,因此这样做可以使@SuppressFBAnnotations放在适当的范围内:整个class,或者可能是更受限制的范围,例如特定方法或构造函数(根据需要)。