2011-01-17 2 views
1

설명이 필요한 메모리 관리/메모리 누수에 대한 질문이 있습니다.유닛 테스트 중 객체 보존 최소화

설정 : 내가 HttpServletRequest의와 HttpResponse에 객체를 취 일부 서블릿 코드를 테스트하고

참조 HttpServletRequest의 #의 getParameter (문자열), HttpServletRequest의 # 대해 getHeader (문자열)와 HttpServletRequest의 #의 getAttribute (문자열).

서블릿 코드에 대한 단위 테스트를 작성하고 있습니다. 테스트를 허용하기 위해 HttpServletRequest 및 HttpServletResponse에 대한 테스트를 허용하는 스텁을 만들었습니다. 내 단위 테스트에서

public final class HttpServletRequestStub implements HttpServletRequest { 

    private Map<String, String> parameterMap = new HashMap<String, String>(); 
    private Map<String, String> headerMap = new HashMap<String, String>(); 
    private Map<String, String> attributeMap = new HashMap<String, String>(); 

    public void setParameter(String param, String value) { 
    this.parameterMap.put(param, value); 
    } 
    public void setHeader(String param, String value) { 
    this.headerMap.put(param, value); 
    } 
    @Override 
    public void setAttribute(String param, String value) { 
    this.attributeMap.put(param, value); 
    } 
    public void flush() { 
    this.parameterMap.clear(); 
    this.headerMap.clear(); 
    this.attributeMap.clear(); 
    } 

    @Override 
    public String getParameter (String parameter) { 
    return this.parameterMap.get(parameter); 
    } 
    @Override 
    public String getHeader(String parameter) { 
    return this.headerMap.get(parameter); 
    } 
    @Override 
    public String getAttribute(String attribute) { 
    return this.attributeMap.get(attribute); 
    } 

    .... Other stubbed methods 




} 

: 샘플 코드는 아래와 같습니다 내 질문은 메모리 관리에 관한됩니다

public class MyTest { 
    private MyServlet servlet; 

    private HttpServletRequest request; 

    private HttpServletResponse response; 

    @Before 
    public void setUp() throws Exception { 
     request = new HttpServletRequestStub(); 
     response = new HttpServletResponseStub(); // Not in the sample code but implemented. 
     servlet = new MyServlet(); 
    } 

    @After 
    public void tearDown() throws Exception { 
     request = null; 
     response = null; 
     servlet = null; 
    } 

    @Test 
    public void testFoo() throws Exception { 
    request.setParameter("foo", "bar"); 
    request.setAttribute("attrib", "attrib"); 
    request.setHeader("header", "header"); 
    servlet.service(request, response); 
    } 


} 

. 테스트 실행 후 가짜 헤더, 요청 및 특성 맵 내용을 플러시하는 것이 필요합니까? 요청 (@After로 주석 처리 됨)에 응답 객체가 역 참조 방식으로 역 참조되는 경우 자동으로 발생합니까? 메모리 참조를 지우기 위해 내리기 메서드에서 명시 적으로 flush 메서드를 호출해야합니까? HashMap 대신 약한 HashMap을 사용하여 스텁 맵에 대한 인 워그 참조를 설정해야한다고 생각했지만 이것이 올바른 선택인지 여부는 알 수 없습니다. 이 article을 통해 읽었으며 여전히 명확하지 않습니다. 도움이 필요할 것입니다.

감사합니다, 개체의

Kartik

답변

1

역 참조는 충분합니다. Java 가비지 컬렉터는 액세스 할 수없는 모든 객체를 제거합니다. 즉, 액세스에 도움이되는 참조가 없습니다. 객체가 실제로 사라 졌다는 의심이들 경우, 사용 가능한 자바 프로파일 러를 사용할 수 있습니다.

그런데 SerbletRequestStub와 같은 항목을 직접 구현하는 대신 모의 객체를 사용할 수있는 구현 중 하나를 사용하는 것이 좋습니다. 예를 들어 EasyMock을 참조하십시오. 그리고 하나 더 조언. 이미 모든 웹 관련 스텁을 구현하는 JUnit 확장이 있습니다. Apache Cactus를 참조하십시오.

0

단위 테스트 독립성으로 인해 JUnit은 각 테스트 메소드에 대해 새로운 MyTest 객체를 생성합니다.

즉, testFoo()testBar()이 다른 MyTest 인스턴스에서 호출됩니다. 귀하의 코드는 메모리 문제를 해결하기에 충분합니다.이 경우에도 tearDown()이 필요하지 않습니다. 이전 MyTest 인스턴스는 GC에서 사용할 수 있으므로 아무 것도 참조하지 않으면 해당 멤버도 GC에서 사용할 수 있습니다.