SpringApplicationBuilder не загружается во время интеграционных тестов с JUnit SpringRunner

Это мой первый вопрос на stackru.com.

В последнее время я искал способ изменить, как Spring Boot (2.x) называет свои bean-компоненты, созданные с помощью аннотации @Component (и т. Д.).

Я обнаружил класс SpringApplicationBuilder, который, к счастью, позволяет внедрить пользовательский генератор имен компонентов:

public class Application {

     public static void main(String[] args) {
        new SpringApplicationBuilder(Application.class)
                .beanNameGenerator(customBeanNameGenerator)
                .run(args);
    }

}

Но проблема в том, что, несмотря на то, что это решение работает для производства, оно не работает в модульных тестах JUnit 4.0, где JUnit Runner SpringRunner воссоздает Spring Context для целей тестирования - в этом случае SpringApplicationBuilder вообще не используется, и в результате запуск нашего приложения завершился неудачно из-за проблем с кандидатами в autowiring multi-beans.

@RunWith(SpringRunner.class)
@SpringBootTest(classes= {Application.class} )
public class SomeControllerTest { 
   ... 
}

Есть ли какой-нибудь элегантный способ заставить эти модульные тесты использовать SpringApplicationBuilder?

С уважением.

1 ответ

Свойство "classes" @SpringBootApplication использует только аннотации классов. поэтому код для сборки SpringApplication не работает при запуске тестов.

если вы хотите решить эту проблему, вы можете попробовать другие способы, такие как указание nameGenerator в @ComponentScan

@ComponentScan(nameGenerator = CustomBeanNameGenerator.class)
public class Application {

 public static void main(String[] args) {
    new SpringApplicationBuilder(Application.class)
            .run(args);
 }

}

убедитесь, что класс CustomBeanNameGenerator имеет пустой конструктор.

PS: английский не мой родной язык; пожалуйста, извините за ошибки при печати.

Другие вопросы по тегам