Akashic Records

테스트 지향 프로그래밍 with JUnit - 3 본문

오래된글/Java

테스트 지향 프로그래밍 with JUnit - 3

Andrew's Akashic Records 2018. 4. 7. 23:36
728x90

Ch 3 모의 객체 사용하기

단위 테스트의 목표는 한번에 메서드 하나만을 실행해 보는 아주 작은 단위의 테스트다. 하지만 이 하나의 메서드를 실행하기 위해 네트워크나, 데이터베이스, 서블릿 엔진 과 같은 자원에 의존한다면 단위 테스트는 작은 테스트로 보이지 않을 것이다.


다행이 이와 같이 외부 자원에 의존하는 “모의 객체”는 아주 유용한 테스트 패턴을 제공해준다. 모의 객체는 다음과 같은 상황에서 아주 유용하다.

1. 진짜 객체가 비 결정적인 동작을 한다.(예상할 수 없는 결과를 만들어 낸다.)

2. 진짜 객체가 준비 설정하기 어렵다.(서블릿를 단위테스트 하기 위해 서블릿 엔진를 설치 할수 없는 상황이다.)

3. 진짜 객체가 직접 유발시키기 어려운 동작을 한다.(임의로 장애 상황을 발생시킬 때)

4. 진짜 객체가 느리다.

5. 진짜 객체가 사용자 인터페이스를 가지거나, 사용자 인터페이스 자체이다.

6. 테스트가 진짜 객체에게 그것이 어떻게 사용되었는지 물어보아야 한다.(callback 함수 등)

7. 진짜 객체가 아직 존재하지 않는다.


모의 객체

http://www.mockobjects.com 에 접속하면 mockobject0.9 버전을 다운받을 수 있다. 이 모의 객체는 Servlet, JMS, JDBC, MAIL 등의 모의 객체 모움이다. 설치법은 간단하다 다운 받은 tar파일을 풀고 jar파일을 클래스 패스에 추가해주면 된다.


모의 객체를 이용한 Junit

userServlet

package chap6.servlet;

import javax.servlet.*;

import javax.servlet.http.*;

import java.io.PrintWriter;

import java.io.IOException;

public class userServlet extends HttpServlet {

private static final String CONTENT_TYPE = "text/html";

public void init(ServletConfig config) throws ServletException {

super.init(config);

}

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

doProcess("GET", request, response);

}

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

doProcess("POST", request, response);

}

public void doProcess(String Type,

HttpServletRequest request,

HttpServletResponse response)

throws ServletException, IOException {

String name = "";

String address = "";

try {

name = request.getParameter("name");

address = request.getParameter("address");

} catch(Exception e) {

e.printStackTrace();

}

response.setContentType(CONTENT_TYPE);

PrintWriter out = response.getWriter();

System.out.println("The servlet has received a "+Type+". This is the reply.");

System.out.println("name = "+name);

System.out.println("address = "+address);

out.print(name+" "+address);

out.close();

}

}


TestCase

package chap6.servlet.test;

import junit.framework.Test;

import junit.framework.TestCase;

import junit.framework.TestSuite;

import chap6.servlet.userServlet;

import com.mockobjects.servlet.MockHttpServletRequest;

import com.mockobjects.servlet.MockHttpServletResponse;

public class userServletTester extends TestCase {

MockHttpServletRequest request;

MockHttpServletResponse response;

public userServletTester(String sTestName) {

super(sTestName);

}

public void setUp()

throws Exception {

request = new MockHttpServletRequest();

response = new MockHttpServletResponse();

request.setupAddParameter("name","Hurukku");

request.setupAddParameter("address","SEOUL GUI DONG");

response.setExpectedContentType("text/html");

}

public void tearDown()

throws Exception {

request = null;

response = null;

}

/**

* void doGet(HttpServletRequest, HttpServletResponse)

*/

public void testdoGet()

throws Exception {

userServlet webUser = new userServlet();

webUser.doGet(request, response);

response.verify();

assertEquals("출력된 값이 기대치와 틀립니다.", "Hurukku SEOUL GUI DONG", response.getOutputStreamContents());

}

/**

* void doPost(HttpServletRequest, HttpServletResponse)

*/

public void testdoPost()

throws Exception {

userServlet webUser = new userServlet();

webUser.doPost(request, response);

response.verify();

System.out.println(response.getOutputStreamContents());

assertEquals("출력된 값이 기대치와 틀립니다.", "Hurukku SEOUL GUI DONG", response.getOutputStreamContents());

}

}


실행 : java junit.textui.TestRunner chap6.servlet.test.userServletTester

모의 객체를 사용하기 위해서 테스트 대상이 되는 Servlet을 특별히 수정할 필요가 없다. Servlet을 수행하기에 필요한 인자인 HttpServletRequest, HttpServletResponse을 모의 객체로 생성하여 인자로 호출하면 된다.


728x90
Comments