【发布时间】:2011-01-17 07:38:56
【问题描述】:
我有一个关于内存管理/内存泄漏的问题,我想澄清一下。
设置:
我正在测试一些使用 HttpServletRequest 和 HttpResponse 对象引用 HttpServletRequest#getParameter(String)、HttpServletRequest#getHeader(String) 和 HttpServletRequest#getAttribute(String) 的 servlet 代码。
我正在为 servlet 代码编写单元测试。为了允许测试,我为 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 方法来清除内存引用?我想我可能需要使用 Weak HashMap 而不是 HashMap 为存根映射设置弱引用,但我不知道这是否是正确的选择。我通读了这个article,但仍然不清楚。任何帮助都会很有用。
谢谢,
卡提克
【问题讨论】:
标签: java unit-testing memory-leaks