스프링 통합 테스트 지원

Download Report

Transcript 스프링 통합 테스트 지원

지식iN서비스개발팀 임수민


스프링 통합 테스트를 위한 spring-test.jar 모듈
추가
MVC에서 HttpServletRequest 와
HttpServletResponse필요로 하는 것을 테스트에
서는 객체 생성불가
◦ MockHttpServletRequest 객체를 이용한 컨트롤러 테스
트

MockHttpServletRequest 객체 생성 및 설정

- MockHttpServletRequest 객체를 이용한 컨트
롤러 테스트
◦ addParameter(String name, String value)
◦ addParameter(String name,String[] values)
◦ request.setMethod("GET");
◦ request.setMethod("POST");



AbstractDependencyInjectionSpringContextTe
sts 클래스가 Application Context를 생성
스프링의 자동 설정 기능을 사용하여 테스트 클래
스의 프로퍼티 값을 스프링 빈 객체로 전달
스프링 설정 파일 세팅: getConfigLocations(),
<- 파일경로 추가
- Class AbstractSpringContextTests
스프링 Application Context 생성하고, 하위 클래스에서 사용할
수 있도록 지원
- Class AbstractDependencyInjectionSpringContextTests
AC 생성하고 DI를 이용하여 테스트 클래스의 프로퍼티를 설정
- Class AbstractTransactionalSpringContextTests
DI를 통한 테스트 클래스의 프로퍼티 설정과 더불어 각 테스트 메
서드를 트랜잭션 범위에서 실행
- Class AbstractTransactionalDataSourceSpringContextTests
트랜잭션 기능을 제공할 뿐만 아니라 JDBC 템플릿을 제공함
- Class AvstractAnnotationAwareTransactional Tests
스프링이 제공하는 자바 5 어노테이션 지원


@RunWith 어노테이션을 이용한 테스트
org.junit.runner.Runner 구현 클래스 지정
◦ @Autowired나 @Resource
 테스트 코드에서 필요로 하는 스프링 빈 객체는 를 이용하여
설정

테스트를 트랜잭션 범위 안에서 하고 싶을 때
◦ @TransactionConfiguration : 테스트 클래스에 적용되
며, 트랜잭션 관리자와 기본 롤백 규칙 설정
◦ @RollBack : 테스트 메서드에 적용, 메서드 단위로 롤백
규칙을 설정
◦ @NotTransactional : 트랜잭션을 적용하지 않을 메서드
에 적용한다
◦ @Transactional : 테스트 클래스에 적용

Object 사용시 ApplicationContextAware인퍼테
이스 구현
public class GuestBookWriteServiceAnnoTest implements
ApplicationContextAware{
...
}
@Test
public void testWrite(){
SomeBean bean = (SomeBean) applicationContext.getBean(...);
}
private ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext
applicationContext) throws BeansException{
this.applicationContext = applicationContext;
}

ApplicationContext 생성 후 모든 test method
에 동일한 Application Context를 재사용 가능
◦ 변수: Application Context상태가 변경 되면 다음 테스
트에 영향을 받음
◦ 해결: @DirtiesContext 어노테이션 적용
 @DirtiesContext
public void makeContextDirty(){...}
public void needNotDirtyContext(){...}


Abstract Transactional JUnit4 Spring
ContextTests를 이용
이 클래스는 protected 이며 JdbcTemplate 필드
제공 , 클래스 상속 받아 구현함
 extends AbstractTransactionlJUnit4
SpringContextTests
import org.jmock.integration.junit4.JMock;
import org.jmock.integration.junit4.JUnit4Mockery;
private Mockery mockery = new JUnit4Mockery();
private OrganizationIntroduceAction action;
private ExpertBO expertBO;
@Before public void setUp() {
expertBO = mockery.mock(ExpertBO.class);
action = new OrganizationIntroduceAction() {
public void setPageNavigation(int totalCount, int page, int
PAGE_LIST_SIZE, int PAGE_UNIT_SIZE) {
}
public void setPanel() {
}
};
action.setExpertBO(expertBO);
}
final ExpertSearchCondition searchCondition =
new
ExpertSearchCondition(organization.getDivisionId(),
organizationId, edirId, 0, false, null, orderBasis, page, 10);
final ExpertList expertList = new
ExpertList(Arrays.asList(new ExpertList.Item()));
mockery.checking(new Expectations() {{
one(expertBO).selectOrganization(organizationId);
will(returnValue(organization));
one(expertBO).selectExpertDirectoryListByOrganization(orga
nization.getDivisionId(), organizationId);
will(returnValue(edirs));
one(expertBO).selectExpertList(searchCondition);
will(returnValue(expertList));
}});
action.setOrganizationId(organizationId);
action.setEdirId(edirId);
action.setPage(page);
action.setOrderBasis(orderBasis.name());
assertEquals(Action.SUCCESS,
action.execute());
assertEquals(organization,
action.getOrganization());
assertEquals(edirs, action.getEdirs());
assertEquals(expertList,
action.getExpertList());
assertEquals(orderBasis.name(),
action.getOrderBasis());