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



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

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

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

无论如何,对于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. 有没有办法忽略单个FindBugs警告
  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. 最后模拟UserService以返回预配置的用户BDDMockito.given(user_service_mock.getUser()).willReturn(preconfigured_user)

相关内容

  • 没有找到相关文章

最新更新