gpt4 book ai didi

java - junit 中的 findbugs "Nonnull field is not initialized"错误不正确

转载 作者:行者123 更新时间:2023-12-02 00:08:33 26 4
gpt4 key购买 nike

import org.junit.Test;
import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
import edu.umd.cs.findbugs.annotations.NonNull;

@DefaultAnnotation(NonNull.class)
public class FooTest {
private Foo foo;

@Before
public void setUp() throws ParseException {
foo = ...;
}

@Test
public void testScenario1() {
foo.getId();
...
}
}

这会导致 findbugs 失败:

NP: Nonnull field foo is not initialized 
by new FooTest( (NP_NONNULL_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR)

这是为什么呢?FindBugs 没有看到这是一个 junit 测试吗?(因此在执行每个测试之前调用 setUp())

一种解决方法是添加此类注释:

@SuppressWarnings(
value="NP_NONNULL_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR",
justification="it is initialized in setUp()")

但这不太好。还有更好的主意吗?

最佳答案

Why is that? Does FindBugs not see that this is a junit test? (and therefore setUp() is called before executing each test)

基本上是的。很明显,FindBugs 并不具备 JUnit 测试用例及其工作原理的专门知识。 (我有点惊讶你甚至在单元测试上运行 FindBugs ...)

One workaround is to add this class annotation ... Any better idea?

将字段显式初始化为 null 更简单。这应该能满足 FindBugs 的要求。

<小时/>

Yes, I hesitated to add NonNull annotations in the tests; but the tests themselves can contain bugs, so why not? Why not running FindBugs over the unit tests?

因为这样的问题!

单元测试与普通代码有本质上的不同。例如,如果 foo 字段被意外保留为 null,那么最糟糕的情况就是单元测试将崩溃,您将发现错误并修复它。它不会直接破坏生产代码,并且只有在您习惯忽略失败的单元测试时才会产生任何影响。

I cannot initialize foo to null, since it is defined as NonNull (by the DefaultAnnotation)

根据 TimK 的回答,这意味着在构造函数完成执行后,foo 必须为非空。鉴于您已经为整个代码库(包括测试用例)指定了该不变式,您必须坚持它,或者添加一个异常(exception)。

一个拼凑可能是创建一个虚拟 Foo 实例,并使用它来初始化 foo。但添加 SuppressWarnings 更简单......

<小时/>

坦率地说,您需要更深入地思考您想要通过 FindBugs 实现的目标。在单元测试中运行它似乎会产生比它解决的问题更多的问题。

关于java - junit 中的 findbugs "Nonnull field is not initialized"错误不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13362535/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com