Это скребок головы. У меня есть это:
@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);
}
Я получаю NPE в тестируемом классе, где написано:
if(!kafkaConsumer.isRunning()) {
Все, что делает isRunning () - возвращает логическое значение isRunning, для которого установлено значение true или false. Ничего больше.
Я попытался сделать общедоступным sureKafkaConsumerIsRunning (). Я пытался использовать Ответы в тесте, а не только когда (), но безрезультатно.
Есть идеи?
UPDATE:
Это было так очевидно, что прошло мимо нас всех! Просто:
@Before
public void initMocks(){
MockitoAnnotations.initMocks(this);
}
Тогда это было так. Это сработало.
Спасибо всем, кто нашел время, чтобы прочитать и ответить.