Если вы измените свой StartupListenerTest, чтобы сосредоточиться только на классе StartupListener
т.е. добавить класс в аннотацию SpringBootTest
@SpringBootTest(classes= {StartupListener.class})
Вы получите другую ошибку, но она больше сфокусирована на классе, который вы пытаетесь протестировать.
onApplicationEvent
метод сработает до запуска теста. Это означает, что вы не инициализировали свой макет с помощью when(troubleshootingConfig.getMachine()).thenReturn(machine);
, поэтому машина не возвращается при вызове getMachine (), следовательно, NPE.
Лучший подход к решению этой проблемы зависит от того, чего вы пытаетесь достичь с помощью теста. Я бы использовал файл application-test.properties для настройки TroubleShootingConfig, а не @MockBean. Если все, что вы делаете в своем onApplicationEvent
- это ведение журнала, вы можете использовать @SpyBean, как предложено в другом ответе на этот вопрос. Вот как ты мог это сделать.
Добавить application-test.properties
в папку ресурсов, чтобы она находилась в пути к классам:
troubleshooting.maxChildRestarts=4
troubleshooting.machine.id=machine-id
troubleshooting.machine.key=machine-key
Добавить @Configuration
к TroubleshootingConfig
@Configuration
@ConfigurationProperties(prefix = "troubleshooting")
public class TroubleshootingConfig {
private Machine machine;
private Integer maxChildRestarts;
... rest of the class
Измените StartupListenerTest
, чтобы сосредоточиться на классах, которые вы тестируете, и следите за TroubleshootingConfig
. Вам также необходимо @EnableConfigurationProperties
@RunWith(SpringRunner.class)
@SpringBootTest(classes= {TroubleshootingConfig.class, StartupListener.class})
@EnableConfigurationProperties
public class StartupListenerTest {
@Autowired
private StartupListener startupListener;
@SpyBean
private TroubleshootingConfig troubleshootingConfig;
@MockBean
private Fizzbuzz fizzbuzz;
@Mock
private TroubleshootingConfig.Machine machine;
@Mock
private ContextRefreshedEvent event;
@Test
public void should_do_something() {
when(troubleshootingConfig.getMachine()).thenReturn(machine);
when(fizzbuzz.getFoobarId()).thenReturn(2L);
when(machine.getKey()).thenReturn("FLIM FLAM!");
// when
startupListener.onApplicationEvent(event);
// then
verify(machine).getKey();
}
}