Spring - 테스트 전략

2010. 8. 17. 00:30plming/Java - Spring

1. ApplicationContext 생성

   ClassPathXmlApplicationContext는 클래스패스에 있는 XML 빈 설정파일을 이용할 때 사용

 String[] paths = { "/WEB-INF/applicationContext.xml" };
 ctx = new ClassPathXmlApplicationContext(paths);

 userDAO = (UserDAO) ctx.getBean("userDAO");


   FileSystemXmlApplicationContext는 파일 시스템에 있는 XML 빈 설정파일을 이용

 String[] paths = { "chapter2/web/WEB-INF/applicationContext.xml" };
 ctx = new FileSystemXmlApplicationContext(paths);

 userDAO = (UserDAO) ctx.getBean("userDAO");



2. 퍼시스턴스 계층에 대한 테스트 전략

 import junit.framework.TestCase;

 import org.springframework.context.ApplicationContext;
 import org.springframework.context.support.ClassPathXmlApplicationContext;

 public class MySQLUserDAOTest extends TestCase {
     private ApplicationContext ctx;
     private UserDAO userDAO;

     protected void setUp() throws Exception {
         String[] paths = { "/WEB-INF/applicationContext.xml" };
         ctx = new ClassPathXmlApplicationContext(paths);

         userDAO = (UserDAO) ctx.getBean("userDAO");
     }

     public void testAddAndFindAndDeleteUser() throws Exception {
         User user = populateUser();

         try {
             assertEquals(1, userDAO.insert(user));
             User dbUser = userDAO.findUser(user.getUserId());

             assertEquals(user, dbUser);
         } finally {
             assertEquals(1, userDAO.delete(user.getUserId()));
         }
     }

     public void testFindAndUpdateUser() throws Exception {
         User user = populateUser();

         try {
             assertEquals(1, userDAO.insert(user));
             assertEquals(1, userDAO.update(user));
             User dbUser = userDAO.findUser(user.getUserId());

             assertEquals(user, dbUser);
         } finally {
             assertEquals(1, userDAO.delete(user.getUserId()));
         }
     }
 }


"모든 메소드에 대하여 단위 테스트 메소드가 하나씩 존재해야 한다" 보다는
애플리케이션의 복잡도나 난이도에 따라서 테스트 전략도 적절하게 변화하는 것이 좋은 선택


3. 비즈니스 계층에 대한 테스트 전략
   가능한 한 데이터베이스와 직접적인 통신을 하지 않는 상태에서 테스트가 가능하도록 전략을 세우는 것이 좋다.

   비즈니스 계층과 퍼시스턴스 계층 사이에 인터페이스만 제대로 설계되어 있다면,
   비즈니스 계층을 테스트하는 것은 충분히 가능하기 때문이다.

   비즈니스 로직이 포함되어 있는 메소드들에 대해서만 철저하게 테스트

   모의 객체 프레임워크(EasyMock: http://www.easymock.org)를 이용할 경우,
   새로운 클래스를 추가하지 않고도 테스트하는 것이 가능하다.

   테스트 방법은 EasyMock에서 제공하는 MockControl을 이용하여 UserDAO에 대한 프록시 클래스를 생성한다.  EasyMock 은 이렇게 생성된 프록시 클래스의 메써드를 호출할 때 호출하는 메써드가 반환해야하는 값을 결정하는 것이 가능하다.  비즈니스 계층의 UserServiceImpl 클래스는 반환값에 따라 비즈니스 로직이 결정되기 때문에 UserDAO의 메써드가 호출될 때의 반환값을 변경시킬 수 있다면 모든 경우의 수에 대한 테스트가 가능하다.


4. Spring 프레임워크 기반 애플리케이션의 테스트 용이성
   개발할 때 Strategy 패턴을 이용하게 되면 소스코드의 수정 없이도 테스트하는 것이 가능하다.


[출처] http://www.javajigi.net/pages/viewpage.action?pageId=3833857
[출처] Spring 프레임워크 워크북