gpt4 book ai didi

java - 最大限度地减少单元测试期间的对象保留

转载 作者:太空宇宙 更新时间:2023-11-04 08:44:03 25 4
gpt4 key购买 nike

我有一个关于内存管理/内存泄漏的问题,希望得到澄清。

设置:

我正在测试一些采用 HttpServletRequest 和 HttpResponse 对象引用 HttpServletRequest#getParameter(String)、HttpServletRequest#getHeader(String) 和 HttpServletRequest#getAttribute(String) 的 Servlet 代码。

我正在为 servlet 代码编写单元测试。为了允许测试,我为 HttpServletRequest 和 HttpServletResponse 创建了允许测试的 stub 。示例代码如下:

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);
}


}

我的问题是关于内存管理的。我是否有必要在测试执行后刷新假 header 、请求和属性映射内容,或者一旦在我的拆卸方法中取消引用请求、响应对象(用@After注释),它会自动发生吗?我是否必须在拆卸方法中显式调用刷新方法来清除内存引用?我想我可能需要使用 Wea​​k HashMap 而不是 HashMap 为 stub 映射设置弱引用,但我不知道这是否是正确的选择。我读过这篇article目前还不清楚。任何帮助都会很有用。

谢谢

卡提克

最佳答案

取消引用对象应该就足够了。 Java 垃圾收集器删除所有无法访问的对象,即没有有助于访问它们的引用。如果您怀疑您的对象是否真的消失了,您可以使用任何可用的 java 分析器。

顺便说一句,我可以建议您使用 Mock 对象的可用实现之一,而不是自己实现 SerbletRequestStub 之类的东西吗?例如,请参见 EasyMock。还有一个建议。 JUnit 扩展已经实现了所有与 Web 相关的 stub 。请参阅 Apache 仙人掌。

关于java - 最大限度地减少单元测试期间的对象保留,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4710973/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com