如何摆脱 Mockito mock Uninitialized read findbugs 警告

How to get rid of Mockito mock Uninitialized read findbugs warning

我如何初始化 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,因为我用的是sonar。对于静态代码分析工具,我通常发现默认规则并不总是最好的,所以我倾向于调整它们并针对新的开发模式更新它们。

无论如何,对于 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>
    

请注意,这两个都是伪代码,我是用智能手机写的。所以可能缺少强制语句and/or规则(UR)可能有误,bug描述在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 是实体或值对象我强烈建议不要模拟这样的 类。对于这些,我更喜欢使用 builders。通常我会制作一个 test 可以像那样使用的构建器 UserBuilder.userWithId(73L).build()
  2. 最后将 UserService 模拟为 return 预配置用户 BDDMockito.given(user_service_mock.getUser()).willReturn(preconfigured_user)