JUnit4와 Spring 3.0.4를 활용한 통합 테스트 구현

Spring 프레임워크에서 JUnit 4를 활용한 테스트单元 구현 방법을 설명한다. Spring 테스트 관련 JAR 파일 중 spring-test-3.0.0.RELEASE.jar 파일이 필수적으로 필요하다.

기본 테스트 클래스 구성

다음은 Spring 컨텍스트와 통합된 테스트 基底 클래스의 구현 예시이다.

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations={"classpath:applicationContext-*.xml"})
@TransactionConfiguration(defaultRollback = false)
public class BaseTest extends AbstractTransactionalJUnit4SpringContextTests {

    private static final String TEST_USER_ID = "5552";
    private static final String TEST_PASSWORD = "555";
    
    @Autowired
    private LoginService loginService;
    
    public String httpLogin() throws BaseException {
        MockHttpServletRequest request = new MockHttpServletRequest();
        MockHttpServletResponse response = new MockHttpServletResponse();
        request.setMethod("POST");
        request.addParameter("loginid", TEST_USER_ID);
        request.addParameter("passwd", TEST_PASSWORD);
        String loginResult = loginService.login(request, response);
        return loginResult;
    }
}

자세한 설정 방법은 Spring 공식 문서에서 확인할 수 있다. (참조: http://static.springsource.org/spring/docs/3.0.4.RELEASE/reference/html/testing.html#mock-objects)

Struts2 ActionContext 통합

애플리케이션 코드에서 ActionContext를 사용하는 경우, 테스트 환경에서도 해당 컨텍스트를 구성해야 한다. Struts2.3.14 버전 이상의 문서에서 JUnit 통합 방법이详细介绍되어 있으며, 다음은 테스트 환경에 맞는 ActionContext 구성 예시이다.

ActionContext.setContext(new ActionContext(new HashMap<String, Object>()));
ActionContext.getContext().setSession(new HashMap<String, Object>());

완전한 테스트 데모

다음은 HTTP 세션 및 요청을 모사한 전체 테스트 구현 예시이다.

import java.util.HashMap;

import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;
import org.springframework.mock.web.MockHttpSession;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.transaction.TransactionConfiguration;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import com.example.app.login.service.LoginService;
import com.example.core.exception.BaseException;
import com.opensymphony.xwork2.ActionContext;

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations={
    "classpath:applicationContext-*.xml",
    "classpath:abstractSessionTest.xml"
})
@TransactionConfiguration(defaultRollback = false)
public class BaseTest extends AbstractTransactionalJUnit4SpringContextTests {

    private static final String TEST_USER_ID = "555";
    private static final String TEST_PASSWORD = "555";
    
    @Autowired
    private LoginService loginService;
    
    public String httpLogin() throws BaseException {
        initSession();
        initRequest();
        request.setMethod("POST");
        request.addParameter("loginid", TEST_USER_ID);
        request.addParameter("passwd", TEST_PASSWORD);
        
        ActionContext.setContext(new ActionContext(new HashMap<String, Object>()));
        ActionContext.getContext().setSession(new HashMap<String, Object>());
        
        String loginResult = loginService.login(request, response);
        return loginResult;
    }
    
    protected MockHttpSession session;
    protected MockHttpServletRequest request;
    protected MockHttpServletResponse response;

    protected void initSession() {
        session = new MockHttpSession();
    }

    protected void closeSession() {
        session.clearAttributes();
        session = null;
    }
    
    protected void initRequest() {
        request = new MockHttpServletRequest();
        response = new MockHttpServletResponse();
        request.setSession(session);
        RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request));
    }

    protected void closeRequest() {
        ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).requestCompleted();
        RequestContextHolder.resetRequestAttributes();
        request = null;
    }
}

세션 스코프 Bean 설정

테스트에서 session 및 request 스코프를 사용하기 위한 Spring 설정 파일(abstractSessionTest.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"
    xmlns:jee="http://www.springframework.org/schema/jee"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
    http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
    http://www.springframework.org/schema/tx 
    http://www.springframework.org/schema/tx/spring-tx-2.5.xsd 
    http://www.springframework.org/schema/jee 
    http://www.springframework.org/schema/jee/spring-jee-2.5.xsd 
    http://www.springframework.org/schema/aop 
    http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-2.5.xsd">
    
    <bean class="org.springframework.beans.factory.config.CustomScopeConfigurer">
        <property name="scopes">
            <map>
                <entry key="session">
                    <bean class="org.springframework.web.context.request.SessionScope" />
                </entry>
                <entry key="request">
                    <bean class="org.springframework.web.context.request.RequestScope" />
                </entry>
            </map>
        </property>
    </bean>
</beans>

위 설정은 테스트 환경에서 Spring의 세션 및 요청 스코프 Bean을 올바르게 동작시키기 위한 필수적인 구성이다.

태그: junit4 Spring integration-testing java test-automation

7월 28일 04:43에 게시됨