Перейти к основному содержимому

Не удалось загрузить ApplicationContext для JUnit Test контроллера Spring

· 4 мин. чтения

Задача: Наибольшая подстрока палиндром

Для заданной строки s, верните наибольшую подстроку палиндром входящую в s. Подстрока — это непрерывная непустая последовательность символов внутри строки. Стока является палиндромом, если она читается одинаково в обоих направлениях...

ANDROMEDA 42

1. Обзор

Гибридное определение bean - компонентов в приложении Spring Boot включает в себя как конфигурацию на основе аннотаций, так и конфигурацию на основе XML . В этой среде мы можем захотеть использовать конфигурацию на основе XML в тестовых классах . Однако иногда в этой ситуации мы можем столкнуться с ошибкой загрузки контекста приложения « Не удалось загрузить ApplicationContext ». Эта ошибка появляется в тестовых классах, потому что контекст приложения не загружается в тестовый контекст.

В этом руководстве мы обсудим , как интегрировать контекст приложения XML в тестирование приложения Spring Boot.

2. Ошибка «Не удалось загрузить ApplicationContext»

Давайте воспроизведем ошибку, интегрировав контекст приложения на основе XML в приложение Spring Boot.

Во-первых, давайте предположим, что у нас есть файл application-context.xml с определением сервисного компонента:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">

<bean id="employeeServiceImpl" class="com.foreach.xmlapplicationcontext.service.EmployeeServiceImpl" />
</beans>

Теперь мы можем добавить файл application-context.xml в папку webapp/WEB-INF/ :

./d8d8ffcffe5df48c5131877ebf1ef1c5.png

Мы также создадим сервисный интерфейс и класс:

public interface EmployeeService {
Employee getEmployee();
}

public class EmployeeServiceImpl implements EmployeeService {

@Override
public Employee getEmployee() {
return new Employee("ForEach", "Admin");
}
}

Наконец, мы создадим тестовый пример для получения bean-компонента EmployeeService из контекста приложения:

@RunWith(SpringRunner.class)
@ContextConfiguration(locations={"classpath:WEB-INF/application-context.xml"})
public class EmployeeServiceAppContextIntegrationTest {

@Autowired
private EmployeeService service;

@Test
public void whenContextLoads_thenServiceISNotNull() {
assertThat(service).isNotNull();
}

}

Теперь, если мы попытаемся запустить этот тест, мы увидим ошибку:

java.lang.IllegalStateException: Failed to load ApplicationContext

Эта ошибка появляется в тестовых классах, потому что контекст приложения не загружается в тестовый контекст. Более того, основной причиной является то, что WEB-INF не включен в путь к классам :

@ContextConfiguration(locations={"classpath:WEB-INF/application-context.xml"})

3. Использование ApplicationContext на основе XML в тестировании

Давайте посмотрим, как мы можем использовать ApplicationContext на основе XML в тестовых классах. У нас есть два варианта использования ApplicationContext на основе XML в тесте : аннотации @SpringBootTest и @ContextConfiguration .

3.1. Протестируйте с помощью @SpringBootTest и @ImportResource

Spring Boot предоставляет аннотацию @SpringBootTest , которую мы можем использовать для создания контекста приложения, который будет использоваться в тесте . Кроме того, мы должны использовать @ImportResource в основном классе Spring Boot для чтения XML-бинов . Эта аннотация позволяет нам импортировать один или несколько ресурсов, содержащих определения компонентов.

Во-первых, воспользуемся аннотацией @ImportResource в основном классе:

@SpringBootApplication
@ImportResource({"classpath*:application-context.xml"})

Теперь давайте создадим тестовый пример для получения bean-компонента EmployeeService из контекста приложения:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = XmlBeanApplication.class)
public class EmployeeServiceAppContextIntegrationTest {

@Autowired
private EmployeeService service;

@Test
public void whenContextLoads_thenServiceISNotNull() {
assertThat(service).isNotNull();
}

}

Аннотация @ImportResource загружает компоненты XML, расположенные в каталоге ресурсов . Кроме того, аннотация @SpringBootTest загружает компоненты всего приложения в тестовом классе. Таким образом, мы можем получить доступ к bean-компоненту EmployeeService в тестовом классе.

3.2. Тест с использованием @ContextConfiguration с ресурсами

Мы можем создать наш тестовый контекст с различными конфигурациями bean-компонентов , поместив наш тестовый файл конфигурации в каталог src/test/resources .

В данном случае мы используем аннотацию @ContextConfiguration для загрузки тестового контекста из каталога src/test/resources .

Во-первых, давайте создадим еще один bean-компонент из интерфейса EmployeeService :

public class EmployeeServiceTestImpl implements EmployeeService {

@Override
public Employee getEmployee() {
return new Employee("ForEach-Test", "Admin");
}
}

Затем мы создадим файл test-context.xml в каталоге src/test/resources :

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">

<bean id="employeeServiceTestImpl" class="process.service.EmployeeServiceTestImpl" />
</beans>

Наконец, мы создадим тестовый пример:

@SpringBootTest
@ContextConfiguration(locations = "/test-context.xml")
public class EmployeeServiceTestContextIntegrationTest {

@Autowired
@Qualifier("employeeServiceTestImpl")
private EmployeeService serviceTest;

@Test
public void whenTestContextLoads_thenServiceTestISNotNull() {
assertThat(serviceTest).isNotNull();
}

}

Здесь мы загрузили employeeServiceTestImpl из test-context.xml , используя аннотацию @ContextConfiguration .

3.3. Протестируйте использование @ContextConfiguration с помощью WEB-INF

Мы также можем импортировать контекст приложения в тестовые классы из каталога WEB-INF . Для этого мы можем обратиться к контексту приложения, используя его URL-адрес файла :

@RunWith(SpringRunner.class)
@ContextConfiguration(locations = "file:src/main/webapp/WEB-INF/application-context.xml")

4. Вывод

В этой статье мы узнали, как использовать файлы конфигурации на основе XML в тестовых классах в приложении Spring Boot. Как всегда, исходный код, использованный в этой статье, доступен на GitHub .