SpringExtension без явной настройки? - PullRequest
0 голосов
/ 18 июня 2019

У меня есть тест JUnit5 с SpringExtension.Все, что мне нужно, это переменные окружения, которые нужно вставить через Spring * @Value:

@ExtendWith(SpringExtension.class)
class MyTest {
    @Value("${myValue}") String myValue;
    ...

. При этом я получаю сообщение об ошибке:

Не удалось загрузить ApplicationContext. Причина: java.lang.IllegalStateException: Ни GenericGroovyXmlContextLoader, ни AnnotationConfigContextLoader не смогли загрузить ApplicationContext

Конечно, Spring должен иметь конфигурацию контекста, поэтому я поместил его в код теста:

@ExtendWith(SpringExtension.class)
@ContextConfiguration
class MyTest {
    @Value("${myValue}") String myValue;

    @Configuration
    static class TestConfig { /*empty*/ }
    ...

Хотя это работает, для меня это выглядит как лишний шаблонный код.Есть ли более простой способ?

ОБНОВЛЕНИЕ

Одним из более коротких вариантов было бы использование @SpringJUnitConfig, в результате чего @ContextConfiguration и @ExtendWith(SpringExtension.class) были бы из коробки.

Но класс конфигурации (даже пустой) все еще необходим.

Ответы [ 3 ]

2 голосов
/ 19 июня 2019

Как указывалось в других ответах и ​​комментариях, вам необходимо указать пустой источник конфигурации, в частности класс @Configuration, файл конфигурации XML, файл конфигурации Groovy или ApplicationContextInitializer.

Самый простой способ сделать это - создать собственную составную аннотацию , которая предопределяет пустую конфигурацию.

Если вы добавите следующую аннотацию @EmptySpringJUnitConfig в свой проект, вы можете использовать ее (вместо @SpringJUnitConfig) везде, где вы хотите пустую пружину ApplicationContext.

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Inherited
@SpringJUnitConfig(EmptySpringJUnitConfig.Config.class)
public @interface EmptySpringJUnitConfig {
    @Configuration
    class Config {
    }
}
1 голос
/ 19 июня 2019

Вы не можете запустить тест на основе Spring без конфигурации. Среда Spring Test Context Framework (TCF) ожидает / требует ApplicationContext. Для создания ApplicationContext должна присутствовать конфигурация формы (xml, Java).

У вас есть 2 варианта, чтобы заставить его работать

  1. Использовать пустую конфигурацию, файл emtpy XML или пустой @Configuration class
  2. Напишите пользовательский ContextLoader, который создает пустой контекст приложения.

Вариант 1, вероятно, самый простой для реализации. Вы можете создать глобальную пустую конфигурацию и ссылаться на нее из @ContextConfiguration.

0 голосов
/ 18 июня 2019

В SpringBoot для запуска контекста приложения Spring необходимо использовать аннотацию @SpringBootTest в тестовом классе:

@ExtendWith(SpringExtension.class)
@SpringBootTest
class MyTest {
    @Value("${myValue}") String myValue;
    ...

ОБНОВЛЕНИЕ:

Или, если вы используете только Spring Framework (без пружинной загрузки), конфигурация теста зависит от версии используемой вами среды Spring и от конфигурации Spring вашего проекта.

Вы можете установить файлы конфигурации с помощью @ContextConfiguration, если вы используете конфигурацию java, то это будет что-то вроде этого:

@ContextConfiguration(classes = AppConfig.class)
@ExtendWith(SpringExtension.class)
class MyTest {
    ...

или если вы используете конфигурацию xml:

@ContextConfiguration("/test-config.xml")
@ExtendWith(SpringExtension.class)
class MyTest {
    ...

оба они зависят от структуры конфигурации вашего проекта и списка компонентов, которые вам нужны в тестах.

Подробнее о настройке контекста: https://docs.spring.io/spring/docs/current/spring-framework-reference/testing.html#spring-testing-annotation-contextconfiguration

Если вы используете Spring Framework старше 5.0, тогда вам может пригодиться эта библиотека: https://github.com/sbrannen/spring-test-junit5

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...