单元测试中@Nonnull 注释的 Intellij IDEA 警告
Intellij IDEA warnings for @Nonnull annotation in unit tests
假设我有一个方法,其中一些参数用 javax @Nonnull 注释进行注释。
public Something supply(@Nonnull SomeObject someObject) {
(...)
if (someObject == null) throw new ValidationException("Required parameter is null");
(...)
}
IDE 正确地通知我,当我尝试使用显式 null 参数调用此方法时,如下所示:
somethingSupplier.supply(null);
现在我想做的是创建单元测试,检查是否会抛出适当的异常,如果由于某种原因传递给此方法的参数恰好为 null(假设它是某种验证异常)。
如果我尝试像上面的示例那样调用此方法,IDE 将警告我将 null 传递给@Nonnull...但这正是我在这里想要做的。我可以用 @SuppressWarnings("ConstantConditions")
注释调用或方法甚至测试 class,但它会使代码混乱,而且我可能不会收到关于我在代码中犯的其他无意错误的警告。
所以问题是我是否可以在测试 classes 中以某种方式禁用对 @Nonnull 的检查?或者我根本不应该对这些案例进行单元测试?
如果要针对错误情况测试代码行为,是否不可避免地会创建关于被测代码规则错误的代码。如果这些规则可以被 IDE 检查,显然,这些检查将检测到并抑制这些警告是不可避免的。
与抑制警告一样,您应该尽量缩小应用抑制的代码范围。例如,您可以在测试代码中创建一个工厂方法,提供这样一个非法值,该值在基于类型系统的检查的雷达下飞行:
class IllegalValue {
@SuppressWarnings("ConstantConditions")
static @Nonnull <T> T sneakyNullReference() {
return null;
}
}
这样你就限制了对这个小的单一方法的抑制。在您的测试用例中,您可以使用 IllegalValue.sneakyNullReference()
来测试代码的 null
行为而无需额外的抑制,因此在测试代码中的不适当位置使用 null
时会正确地收到警告。我强烈建议永远不要将 sneakyNullReference()
的结果存储到变量中,而是始终在需要的地方直接引用,以清楚起见。
即在你的问题测试中,代码应该看起来像
somethingSupplier.supply(IllegalValue.sneakyNullReference());
所以一个reader马上就明白这里测试的是什么了…
不幸的是,您无能为力。忽略警告或添加抑制警告行。 intellij 可能有一个设置可以让你禁用警告,或者你可以在你不注意的 window 中打印警告,但这都不是一个很好的解决方案,因为这些选项将消除其他相关警告你可能想看看。
假设我有一个方法,其中一些参数用 javax @Nonnull 注释进行注释。
public Something supply(@Nonnull SomeObject someObject) {
(...)
if (someObject == null) throw new ValidationException("Required parameter is null");
(...)
}
IDE 正确地通知我,当我尝试使用显式 null 参数调用此方法时,如下所示:
somethingSupplier.supply(null);
现在我想做的是创建单元测试,检查是否会抛出适当的异常,如果由于某种原因传递给此方法的参数恰好为 null(假设它是某种验证异常)。
如果我尝试像上面的示例那样调用此方法,IDE 将警告我将 null 传递给@Nonnull...但这正是我在这里想要做的。我可以用 @SuppressWarnings("ConstantConditions")
注释调用或方法甚至测试 class,但它会使代码混乱,而且我可能不会收到关于我在代码中犯的其他无意错误的警告。
所以问题是我是否可以在测试 classes 中以某种方式禁用对 @Nonnull 的检查?或者我根本不应该对这些案例进行单元测试?
如果要针对错误情况测试代码行为,是否不可避免地会创建关于被测代码规则错误的代码。如果这些规则可以被 IDE 检查,显然,这些检查将检测到并抑制这些警告是不可避免的。
与抑制警告一样,您应该尽量缩小应用抑制的代码范围。例如,您可以在测试代码中创建一个工厂方法,提供这样一个非法值,该值在基于类型系统的检查的雷达下飞行:
class IllegalValue {
@SuppressWarnings("ConstantConditions")
static @Nonnull <T> T sneakyNullReference() {
return null;
}
}
这样你就限制了对这个小的单一方法的抑制。在您的测试用例中,您可以使用 IllegalValue.sneakyNullReference()
来测试代码的 null
行为而无需额外的抑制,因此在测试代码中的不适当位置使用 null
时会正确地收到警告。我强烈建议永远不要将 sneakyNullReference()
的结果存储到变量中,而是始终在需要的地方直接引用,以清楚起见。
即在你的问题测试中,代码应该看起来像
somethingSupplier.supply(IllegalValue.sneakyNullReference());
所以一个reader马上就明白这里测试的是什么了…
不幸的是,您无能为力。忽略警告或添加抑制警告行。 intellij 可能有一个设置可以让你禁用警告,或者你可以在你不注意的 window 中打印警告,但这都不是一个很好的解决方案,因为这些选项将消除其他相关警告你可能想看看。