Настройте компонент @MockBean перед запуском приложения

У меня есть приложение 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, возвращается.

Проблема в том, что приложение не запускается. В настоящее время порядок работы пружин выглядит следующим образом:

  1. создать все Mocks (без конфигурации все методы возвращают ноль)
  2. запустить приложение
  3. call @ Before-method (где mocks будут настроены)
  4. start test

Моя проблема в том, что приложение запускается с неинициализированным макетом. Таким образом, вызов getSystemType() возвращает ноль.

У меня вопрос: как я могу настроить макеты до запуска приложения?

Редактировать: Если у кого-то есть такая же проблема, один обходной путь использовать @MockBean(answer = CALLS_REAL_METHODS). Это вызывает реальный компонент, и в моем случае система запускается. После запуска я могу изменить макет поведения.

19
задан Sergey Povisenko 24 July 2019 в 21:03
поделиться