如何用Groovy Mock Pulsar Producer?测试时遇空指针异常
解决Pulsar Producer模拟时的NullPointerException问题
问题根源
用Mock框架(如Mockito)模拟Producer时,默认所有方法调用都会返回null。你的代码中myProducer.newMessage()返回了null,后续调用.key()自然会抛出NullPointerException。
解决步骤
- 先模拟
MessageBuilder实例,因为newMessage()需要返回该对象才能支撑链式调用 - 为
Producer的newMessage()方法设置返回值,指向模拟的MessageBuilder - 为
MessageBuilder的key()、value()方法设置返回自身(链式调用要求每个方法返回同一个Builder实例) - 最后模拟
send()方法的行为,避免后续调用出问题
示例代码(以Mockito为例)
// 模拟MessageBuilder对象 MessageBuilder<String> mockMsgBuilder = Mockito.mock(MessageBuilder.class); // 模拟Producer对象 Producer<String> myProducer = Mockito.mock(Producer.class); // 配置newMessage()返回模拟的MessageBuilder Mockito.when(myProducer.newMessage()).thenReturn(mockMsgBuilder); // 配置链式方法返回自身,保证调用链不中断 Mockito.when(mockMsgBuilder.key(Mockito.anyString())).thenReturn(mockMsgBuilder); Mockito.when(mockMsgBuilder.value(Mockito.any(byte[].class))).thenReturn(mockMsgBuilder); // 模拟send()方法,可根据需求设置返回值或空实现 Mockito.doNothing().when(mockMsgBuilder).send();
配置完成后,业务代码调用myProducer.newMessage().key(...).value(...).send()时,每一步都能拿到非空对象,不会再触发NullPointerException。
内容的提问来源于stack exchange,提问作者Dovile Barkauskaite
相关产品推荐
相关产品推荐

