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

标签 java unit-testing memory-leaks

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

设置:

我正在测试一些采用 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/

相关文章:

java - 如何在使用 Mockito.mock() 时启用 STRICT_STUBS

unit-testing - Angular2/Jasmine 期望为空会使浏览器崩溃

Java: "used memory"图处频繁出现峰值

iphone sqlite 内存泄漏 [NSString stringWithUTF8String :(char*)sqlite3_column_text

java - Picasso - 自定义 RequestHandler 不会在磁盘上缓存图像

Java - DAO 层或插件

java - 在 Scala 中 Play 临时文件到 blob 字节缓冲区

java - Struts2中如何在加载页面之前执行一个 Action ?

ios - 需要将 NSArray 的元素转换为 Swift 类

c++ - 链接列表程序在收到用户的值后崩溃