1. 개요

Spring Boot 애플리케이션에서 빈 의 하이브리드 정의는 어노테이션 기반XML 기반 구성 을 모두 포함하는 것 입니다. 이 환경에서는 테스트 클래스에서 XML 기반 구성을 사용할 수 있습니다 . 그러나 때때로 이 상황에서 " Failed to load ApplicationContext "라는 애플리케이션 컨텍스트 로드 오류가 발생할 수 있습니다 . 이 오류는 애플리케이션 컨텍스트가 테스트 컨텍스트에 로드되지 않았기 때문에 테스트 클래스에 나타납니다.

이 예제에서는 XML 애플리케이션 컨텍스트를 Spring Boot 애플리케이션의 테스트에 통합하는 방법에 대해 설명합니다.

2. "ApplicationContext 로드 실패" 오류

Spring Boot 애플리케이션에 XML 기반 애플리케이션 컨텍스트를 통합하여 오류를 재현해 보겠습니다.

먼저 서비스 빈 정의 가 있는 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.baeldung.xmlapplicationcontext.service.EmployeeServiceImpl" />
</beans>

이제 webapp/WEB-INF/ 위치 에 application-context.xml 파일을 추가할 수 있습니다 .

우리는 또한 서비스 인터페이스와 클래스를 만들 것입니다:

public interface EmployeeService {
    Employee getEmployee();
}

public class EmployeeServiceImpl implements EmployeeService {

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

마지막으로 애플리케이션 컨텍스트에서 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 가 classpath에 포함되어 있지 않기 때문입니다 .

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

3. 테스트에서 XML 기반 ApplicationContext 사용하기

테스트 클래스에서 XML 기반 ApplicationContext 를 사용하는 방법을 살펴보겠습니다 . 테스트에서 XML 기반 ApplicationContext 를 사용하는 두 가지 옵션이 있습니다 : @SpringBootTest  및 @ContextConfiguration 어노테이션.

3.1. @SpringBootTest@ImportResource 를 사용하여 테스트

Spring Boot는 @SpringBootTest 어노테이션을 제공 합니다. 이를 사용하여 테스트에서 사용할 애플리케이션 컨텍스트를 생성할 수 있습니다 . 또한 XML bean을 읽기 위해 Spring Boot 메인 클래스에서 @ImportResource 를 사용해야 합니다 . 이 어노테이션을 사용하면 빈 정의가 포함된 하나 이상의 리소스를 가져올 수 있습니다.

먼저 메인 클래스에서 @ImportResource 어노테이션을 사용합시다:

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

이제 애플리케이션 컨텍스트에서 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 어노테이션은 테스트 클래스에서 전체 애플리케이션의 빈을 로드합니다. 따라서 테스트 클래스에서 EmployeeService 빈에 액세스할 수 있습니다 .

3.2. 리소스 와 함께 @ContextConfiguration 을 사용 하여 테스트

테스트 구성 파일을 src/test/resources 디렉토리 에 배치 하여 다양한 구성의 빈으로 테스트 컨텍스트를 생성할 수 있습니다 .

이 경우 src/test/resources 디렉토리 에서 테스트 컨텍스트를 로드하기 위해 @ContextConfiguration 어노테이션을 사용합니다 .

먼저 EmployeeService 인터페이스에서 다른 빈을 생성해 보겠습니다.

public class EmployeeServiceTestImpl implements EmployeeService {

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

그런 다음 src/test/resources 디렉토리 에 test-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="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();
    }

}

여기 에서 @ContextConfiguration 어노테이션 을 사용하여 test-context.xml 에서 employeeServiceTestImpl 을 로드했습니다.

3.3. WEB-INF 와 함께 @ContextConfiguration 을 사용한 테스트

WEB-INF  디렉토리 에서 테스트 클래스의 애플리케이션 컨텍스트를 가져올 수도 있습니다 . 이를 위해 파일  URL을 사용하여 애플리케이션 컨텍스트를 처리할 수 있습니다.

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

4. 결론

이 기사에서는 Spring Boot 애플리케이션의 테스트 클래스에서 XML 기반 구성 파일을 사용하는 방법을 배웠습니다. 항상 그렇듯이 이 기사에 사용된 소스 코드는 GitHub에서 사용할 수 있습니다 .

Junit footer banner