Java 单元测试中@Nonnull注释的Intellij IDEA警告

Java 单元测试中@Nonnull注释的Intellij IDEA警告,java,unit-testing,intellij-idea,java-8,intellij-13,Java,Unit Testing,Intellij Idea,Java 8,Intellij 13,假设我有一个方法,其中一些参数是用javax@Nonnull注释的 public Something supply(@Nonnull SomeObject someObject) { (...) if (someObject == null) throw new ValidationException("Required parameter is null"); (...) } 当我尝试使用显式null参数调用此方法时,IDE会正确地通知我,如下所示: somethin

假设我有一个方法,其中一些参数是用javax@Nonnull注释的

public Something supply(@Nonnull SomeObject someObject) {
    (...)
    if (someObject == null) throw new ValidationException("Required parameter is null");
    (...)
}
当我尝试使用显式null参数调用此方法时,IDE会正确地通知我,如下所示:

somethingSupplier.supply(null);
现在我要做的是创建单元测试,检查是否会抛出正确的异常,如果由于某种原因传递给这个方法的参数恰好为null(假设它是某种验证异常)

若我尝试像上面的例子一样调用这个方法,IDE会警告我将null传递给@Nonnull。。。但这正是我想在这里做的。我可以用
@SuppressWarnings(“ConstantConditions”)
注释调用或方法,甚至测试类,但它会使代码变得混乱,并且我可能不会收到关于我在代码中犯的其他无意错误的警告


所以问题是我是否可以在测试类中禁用对@Nonnull的检查?或者我根本不应该单元测试这些情况?

如果您想测试错误情况下的代码行为,是否不可避免地要创建与被测试代码规则相关的错误代码。如果IDE可以检查这些规则,显然,这些检查将检测到并抑制这些警告是不可避免的

与抑制警告一样,应尽可能缩小抑制应用的代码范围。例如,您可以在测试代码中创建一个工厂方法,提供非法值,该值在基于类型系统的检查的雷达范围内飞行:

class IllegalValue {
    @SuppressWarnings("ConstantConditions")
    static @Nonnull <T> T sneakyNullReference() {
        return null;
    }
}

因此,读者可以立即理解此处测试的内容…

不幸的是,您没有多少可以做的。忽略警告或添加抑制警告行。intellij可能有一个设置可以让你禁用警告,或者你可以在一个你不注意的窗口中打印警告,但这两者都不是一个很好的解决方案,因为这些选项将消除您可能希望看到的其他相关警告。

注释
@Nonnull
并不意味着总是为
null
参数抛出
NullPointerException
。事实上,对于<代码>私有< /COD>方法,我会认为这样的要求是浪费资源,因为验证应该确保在编译时,<代码> null <代码>永远不会传递给方法。因此,当传递
null
时,NPE可能作为操作的副作用出现,但是显式测试应该是过时的。另外,在这个方法的主体中,在某个时刻会抛出一些自定义ValidationException,这对我来说可能很重要(对于回滚或类似的事情)。我已经编辑了这个问题。这看起来是个不错的主意,我会试试看,谢谢@mareckmareck:在Java8中,不需要交换
@Nonnull
的顺序。我使用顺序是因为将其视为类型注释而不是方法注释更有意义。。。出于某种原因IDEA不认为它是一个合适的构造,即使代码编译得很好。。。
somethingSupplier.supply(IllegalValue.sneakyNullReference());