我有一个类似这样的方法:
我想编写一个单元测试,以确保当
注意:理论上编译器的静态空指针应该防止这种情况发生。但是,没有任何东西能够阻止其他人编写一个关闭了静态流分析并使用null调用方法的模块。
常见情况:大而凌乱的旧项目没有流分析。我从注释一些实用模块开始。在这种情况下,我将拥有现有或新的单元测试,检查代码对于所有尚未使用流分析的模块的行为如何。
我的猜测是,我必须将这些测试移动到一个未经检查的模块中,并在扩展流分析时进行移动。这样做可以很好地适应哲学,但需要大量手工操作。
换句话说:我无法轻松地编写一个测试,以便在代码不编译时成功(我必须将代码片段放入文件中,在单元测试中调用编译器,检查输出是否有误...不太美观)。那么,如果调用者忽略@Nonnull,我如何轻松地测试代码是否会像应该失败?
public void foo(@Nonnull String value) {...}
我想编写一个单元测试,以确保当
value
为null
时foo()
会抛出NPE,但是当IDE启用静态空指针流分析时,编译器拒绝编译单元测试。在启用“基于注释的空值分析”的情况下,如何使此测试编译通过(在Eclipse中):@Test(expected = NullPointerException.class)
public void test() {
T inst = ...
inst.foo(null);
}
注意:理论上编译器的静态空指针应该防止这种情况发生。但是,没有任何东西能够阻止其他人编写一个关闭了静态流分析并使用null调用方法的模块。
常见情况:大而凌乱的旧项目没有流分析。我从注释一些实用模块开始。在这种情况下,我将拥有现有或新的单元测试,检查代码对于所有尚未使用流分析的模块的行为如何。
我的猜测是,我必须将这些测试移动到一个未经检查的模块中,并在扩展流分析时进行移动。这样做可以很好地适应哲学,但需要大量手工操作。
换句话说:我无法轻松地编写一个测试,以便在代码不编译时成功(我必须将代码片段放入文件中,在单元测试中调用编译器,检查输出是否有误...不太美观)。那么,如果调用者忽略@Nonnull,我如何轻松地测试代码是否会像应该失败?
@Nonnull
还是@NotNull
? - Adam Aroldnull
变量会发生什么?String s = null; inst.foo(s);
- StanislavLs = Boolean.TRUE ? null : ""
或者s = "TRUE'.toLowerCase().equals("true") ? null : ""
来隐藏变量的初始化逻辑,但仍然拥有空变量。 - StanislavL