Постконструкция и завершение работы JUnit SpringBootTest

#java #spring #junit #spring-cloud

#java #spring #junit #spring-облако

Вопрос:

Я пытаюсь протестировать приложение SpringBoot, которое самостоятельно регистрируется с помощью ServiceRegistry (например. Eureka / Consul), а затем отменяет регистрацию при завершении работы. Реализация просто расширяет уже существующие абстракции spring cloud, например

 @Component
public class MyAutoRegistration extends AbstractAutoServiceRegistration<MyRegistration> {

   @override
   protected void register(){...}

   @Override
   protected void deregister(){...}
  

Регистрация и снятие с регистрации работают, как ожидалось, в примерах приложений, но я не могу зафиксировать это в SpringBootTest, потому что тест выполняется ДО того, как произойдет саморегистрация (т. Е. сразу после загрузки контекста spring и регистрации в журналах отображается «приложение запущено через N секунд …»). Аналогично, тест завершается до завершения работы приложения (т. Е. до завершения работы spring context) и, следовательно, до начала отмены регистрации.

 @RunWith(SpringRunner.class)
@SpringBootTest(classes = MyClientAutoConfiguration.class)
@EnableAutoConfiguration
public class MyRegistrationTest {

@Autowired
MyRegistration record;

@SpyBean
@Autowired
ServiceRegistry<MyRegistration> registry;

@Test
public void registers_and_deregisters(){
    verify(registry, times(1)).register(record);
    verify(registry, times(1)).deregister(record);
}
  

Нашел тестовый класс, который делает нечто подобное, но это немного за пределами моего понимания. Есть ли простой способ включить автоматическую регистрацию / снятие с регистрации в @SpringBootTest?

Комментарии:

1. Не уверен, что там находится за пределами вашего понимания, но это тестирование именно того, что вы описываете, большинство классов — это просто автоматическая регистрация и реестр служб. Одна вещь, которую я заметил, это то, что ваш тест не webEnvironment=RANDOM определен.

2. извините за задержку — возникли проблемы с доступом SO. Я изучу этот пример — я предполагаю, что моя ошибка в понимании связана с прослушивателями событий. Когда я запускаю модульный тест, он существует СРАЗУ после создания контекста spring. Он не ожидает, пока произойдет моя, скажем, авторегистрация или вызовы, аннотированные @PostConstruct . Мой пробел в знаниях связан с тем, что вы сказали spring дождаться завершения автоматической регистрации.

Ответ №1:

Отвлекающий маневр… моя настоящая проблема заключалась в том, что у меня не было spring-boot-starter-web в моем classpath, который неявно импортирует spring-boot-starter-tomcat . Без этого компоненту автоматической регистрации, который я пытался протестировать, не удалось выполнить автоматическую настройку. Возврат starter-web к пути к классу устранил мою проблему.