我有一个Java服务,其中Guice注入的东西很少。
public class RecoveryServiceImpl implements RecoveryService {
@Inject
public RecoveryServiceImpl(SessionInstanceCache sessionInstanceCache, AttendeeCache attendeeCache, MessagingStreamConfiguration messagingConfig) {
this.sessionInstanceCache = sessionInstanceCache;
this.attendeeCache = attendeeCache;
this.messagingConfig = messagingConfig;
}
@Override
public SessionInstanceData recoverSessionInstance(SessionInstanceDto sessionInstance) {
SessionInstanceData sessionInstanceData = SessionInstanceHelper.recoverSessionInstance(sessionInstance);
if (sessionInstanceData.getDeepstreamServerKey() == null) {
String dsKey = SessionInstanceHelper.pickRandomDeepstreamServerKey(
sessionInstanceData, messagingConfig);
这样做:
public static String pickRandomDeepstreamServerKey(
SessionInstanceData sessionInstanceData, MessagingStreamConfiguration dsConfig) {
// NPE occurs here
List<String> dsKeys = new ArrayList(dsConfig.getBaseUrls().keySet());
这已通过Spock进行了测试。
我添加了messagingConfig
,现在我正在努力使其在Spock测试中被嘲笑:
class RecoveryServiceImplTest extends Specification {
...
MessagingStreamConfiguration msgConfig = Mock(MessagingStreamConfiguration);
RecoveryService recoveryService = new RecoveryServiceImpl(sessionInstanceCache, attendeeCache, msgConfig);
def "Recover session instance"() {
...
def dsMap = new HashMap<String, URL>();
dsMap.put("ds1", new URL("http://ilovemocking.com/"));
when:
msgConfig.getBaseUrls() >> dsMap;
//msgConfig.getBaseUrls().keySet() >> new HashSet(){{add("ds1")}};
recoveryService.recoverSessionInstance(sessionInstanceDto)
在对recoverSessionInstance()
的呼叫中,我得到了NPE
,因为getBaseUrls()
返回null。
我尝试了另一种方法,将msgConfig
实例化为普通对象(又称“存根”),但结果相同。
我应该如何使Spock Mock返回dsMap
而不是null
?
答案 0 :(得分:0)
最后,这是一个依赖项.jar中缺少方法的问题(与我所看到的代码相比)。 NPE来自模拟代理而不是表达式本身。但是,很难在堆栈跟踪中看到反射。
我会在一段时间内删除问题。