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/
:
Мы также создадим сервисный интерфейс и класс:
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 .