如何摆脱 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网站
这些想法主要来自:
- Is there a way to ignore a single FindBugs warning?
- http://www.scriptscoop2.com/t/0044ed425b4f/java-how-to-set-a-findbugs-filter-for-fields-with-a-specific-annotation.html
- http://findbugs.sourceforge.net/bugDescriptions.html
我想指出的是,这个例子中 mockito 的使用方式似乎是错误的。这是我的建议:
User
是实体或值对象我强烈建议不要模拟这样的 类。对于这些,我更喜欢使用 builders。通常我会制作一个 test 可以像那样使用的构建器 UserBuilder.userWithId(73L).build()
- 最后将
UserService
模拟为 return 预配置用户 BDDMockito.given(user_service_mock.getUser()).willReturn(preconfigured_user)
我如何初始化 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网站
这些想法主要来自:
- Is there a way to ignore a single FindBugs warning?
- http://www.scriptscoop2.com/t/0044ed425b4f/java-how-to-set-a-findbugs-filter-for-fields-with-a-specific-annotation.html
- http://findbugs.sourceforge.net/bugDescriptions.html
我想指出的是,这个例子中 mockito 的使用方式似乎是错误的。这是我的建议:
User
是实体或值对象我强烈建议不要模拟这样的 类。对于这些,我更喜欢使用 builders。通常我会制作一个 test 可以像那样使用的构建器UserBuilder.userWithId(73L).build()
- 最后将
UserService
模拟为 return 预配置用户BDDMockito.given(user_service_mock.getUser()).willReturn(preconfigured_user)