#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
к пути к классу устранил мою проблему.