如何摆脱Mockito mock未初始化的读取findbugs警告

时间:2016-05-19 11:22:54

标签: java mockito findbugs

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

  

在新的.service.MockUserService()中未初始化读取用户   [.service.MockUserService]在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;
    }
}

1 个答案:

答案 0 :(得分:2)

我不知道很多蠢货,因为我使用了声纳。对于静态代码分析工具,我通常发现默认规则并不总是最好的,所以我倾向于调整它们并为新的开发模式更新它们。

无论如何,对于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
  4. 我想指出在这个例子中使用mockito的方式确实是错误的。这是我的建议:

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