java - 如何摆脱 Mockito mock Uninitialized read findbugs 警告

标签 java mockito findbugs

我如何初始化user,以便我可以在没有findbugs警告的情况下执行user.getUserId()

Uninitialized read of user in new .service.MockUserService() [.service.MockUserService] At MockUserService.java:[line 21]

public class MockUserService extends UserService {

    public static final String FOO_USER_ID = "fooUser";

    @Mock
    private User user;


    public MockUserService() {
        super();
        MockitoAnnotations.initMocks(this);
        Mockito.when(user.getUserId()).thenReturn(FOO_USER_ID);
    }

    @Override
    public User getUser() {
        return getUserSafe();
    }

    @Override
    public User getUserSafe() {
        return user;
    }
}

最佳答案

我不太了解 findbugs,因为我使用声纳。对于静态代码分析工具,我通常发现默认规则并不总是最好的,因此我倾向于调整它们并更新它们以适应新的开发模式。

无论如何,对于 findbugs,谷歌搜索给出了两种可能的解决方案

  • 在每个字段上使用 findbug 注释 (findbugs 3.0.0)

    @edu.umd.cs.findbugs.annotations.SuppressFBWarnings(
        value="UR", 
        justification="This is an auto injected mock")
    
  • 或者设置一个过滤器来忽略 Mock 注释。

    <Match>
       <Bug code="UR">  
       <Field annotation="Mock">
    </Match>
    

请注意,这两个都是伪代码,我是通过智能手机编写的。因此可能缺少强制语句和/或规则(UR)可能是错误的,错误描述位于 findbug 网站上。

这些想法主要来自:

  1. Is there a way to ignore a single FindBugs warning?
  2. http://www.scriptscoop2.com/t/0044ed425b4f/java-how-to-set-a-findbugs-filter-for-fields-with-a-specific-annotation.html
  3. http://findbugs.sourceforge.net/bugDescriptions.html
<小时/>

我想指出的是,在这个例子中使用mockito的方式似乎是错误的。这是我的建议:

  1. User 是一个实体或值对象,我强烈建议不要模拟此类。对于这些,我更喜欢使用构建器。通常我会制作一个测试构建器,可以像UserBuilder.userWithId(73L).build()
  2. 那样使用
  3. 最后改为模拟 UserService 以返回预配置的用户 BDDMockito.given(user_service_mock.getUser()).willReturn(preconfigured_user)

关于java - 如何摆脱 Mockito mock Uninitialized read findbugs 警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37321721/

相关文章:

java - 测试不会改变测试场景中任何内容的 void 方法

hudson - Checkstyle 和 Findbugs 仅在 Jenkins(和/或 Hudson)上更改文件

Java : Joining String from List<String> in reverse order

java - 在 Android 类 ID 和方法 ID 中从 C++ 调用 Java 方法

java - 如何模拟hadoop文件系统

java - 使用 getResourceAsStream 时发现错误 "Method May Fail to Close Stream"

kotlin - 如何避免 Kotlin 字段中的冗余空检查(FindBugs 警告)

java - Google map 未显示签名的 APK

Java并发执行同一个函数

java - 使用mockito和powermock时出现ClassCastException