Java单元测试:返回布尔不起作用的模拟方法,得到NPE

时间:2019-07-05 15:13:32

标签: java unit-testing mockito

这是一个令人头疼的问题。我有这个:

@Autowired
KafkaConsumer kafkaConsumer;
...
private void ensureKafkaConsumerIsRunning() {
    if(!kafkaConsumer.isRunning()) {
        Thread kafkaThread = new Thread(kafkaConsumer);
        synchronized(KafkaConsumer.class) {
            kafkaThread.start();
        }
    }
}

测试:

@InjectMocks
private GreetingService greetingService;
...
@Mock
private KafkaConsumer kafkaConsumer;
...
@Test
public void sendToKafka_Msg_Test() throws Exception {
    RecordMetadata recordMetadata = new RecordMetadata(null, 0L,0L,0L,0L,0,0);
    when(kafkaConsumer.isRunning()).thenReturn(true);
    when(kafkaProducer.sync(anyString())).thenReturn(recordMetadata);
    assertEquals((long) greetingService.sendToKafka("test"), 0L);
}

在正在测试的课程中,我得到了一个N​​PE,内容为:

if(!kafkaConsumer.isRunning()) {

所有isRunning()所做的都是返回一个布尔值“ isRunning”,该布尔值设置为true或false。没什么。

我曾尝试将sureKafkaConsumerIsRunning()公开。我尝试在测试中使用Answers,而不是仅使用when()s,但无济于事。

有什么想法吗?


更新:

很明显,它已经过去了!简单地:

@Before
public void initMocks(){
     MockitoAnnotations.initMocks(this);
}

然后就是那个。奏效了。

感谢所有花时间阅读和回答的人。

2 个答案:

答案 0 :(得分:0)

很明显,它已经过去了!简单地:

@Before
public void initMocks(){
  MockitoAnnotations.initMocks(this);
}

然后就是那个。奏效了。

感谢所有花时间阅读和回答的人。

答案 1 :(得分:-2)

如果kafkaConsumer.isRunning()返回isRunning而不是Booleanboolean为空,则您的kafkaConsumer为空。