У меня есть приложение Spring Boot 1.4.2. Некоторый код, который используется во время запуска, выглядит следующим образом:
@Component
class SystemTypeDetector{
public enum SystemType{ TYPE_A, TYPE_B, TYPE_C }
public SystemType getSystemType(){ return ... }
}
@Component
public class SomeOtherComponent{
@Autowired
private SystemTypeDetector systemTypeDetector;
@PostConstruct
public void startup(){
switch(systemTypeDetector.getSystemType()){ // <-- NPE here in test
case TYPE_A: ...
case TYPE_B: ...
case TYPE_C: ...
}
}
}
Существует компонент, который определяет тип системы. Этот компонент используется во время запуска из других компонентов. На производстве все работает нормально.
Теперь я хочу добавить несколько интеграционных тестов с использованием Spring 1.4 @MockBean
.
Тест выглядит следующим образом:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = MyWebApplication.class, webEnvironment = RANDOM_PORT)
public class IntegrationTestNrOne {
@MockBean
private SystemTypeDetector systemTypeDetectorMock;
@Before
public void initMock(){
Mockito.when(systemTypeDetectorMock.getSystemType()).thenReturn(TYPE_C);
}
@Test
public void testNrOne(){
// ...
}
}
В принципе, насмешка работает нормально. Мой systemTypeDetectorMock используется, и если я вызываю getSystemType
-> TYPE_C
, возвращается.
Проблема в том, что приложение не запускается. В настоящее время порядок работы пружин выглядит следующим образом:
Моя проблема в том, что приложение запускается с неинициализированным макетом. Таким образом, вызов getSystemType()
возвращает ноль.
У меня вопрос: как я могу настроить макеты до запуска приложения?
Редактировать: Если у кого-то есть такая же проблема, один обходной путь использовать @MockBean(answer = CALLS_REAL_METHODS)
. Это вызывает реальный компонент, и в моем случае система запускается. После запуска я могу изменить макет поведения.