2014-09-21 102 views
2

我试图抑制我的单元测试一个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的功能和摇篮仍报插入。帮帮我?

  • JDK:1.7.0_51
  • 的Eclipse:4.3.1
  • FindBugs的功能为Eclipse:2.0.3
  • 摇篮:1.12
  • FindBugs的注释:2.0.3
  • JUnit的: 4.11
  • JMockit:1.12
+0

如果您将'@ SuppressFBWarnings'移动到匿名内部类而不是测试方法上,它是否会保持沉默? – 2014-09-21 23:29:49

+0

顺便说一句,它真的没什么意义......这会更有意义,IMO:'this.result = Preconditions.checkNotNull(“DUMMY”);' – 2014-09-21 23:31:32

+0

@WilliamPrice - 注释不能放在任意语句之前这是所有'新Expecatations'行)。将它分配给一个局部变量并添加注解也不起作用。 – 2014-09-21 23:34:51

回答

2

fol发生this.result一个初始化块内的匿名内部类内作用域

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

Preconditions.checkNotNull的呼叫和分配:降脂代码创建一个匿名内部类。为使@SuppressFBWarnings注释适用于这些语句,注释必须至少放在包含它们的类上。

虽然为匿名内部类及其语句的源代码的ctor_checksForNullArguments试验方法中被物理地写入,将得到的字节码是不实际测试类的一部分,也不是该方法中,并且因此,将注释上该方法将其应用于错误的作用域。

由于任何匿名内部类都可以提取到指定的(非匿名)内部类或甚至顶级类,因此可以将@SuppressFBAnnotations放置在适当的范围上:整个类或潜在的更受限制的范围,如特定的方法或构造函数(根据需要)。

+0

只需将匿名类转换为'ctor_checksForNullArguments'中的一个名称并注释就行。谢谢! – 2014-09-22 00:08:37