【问题标题】:Mockito throws an OutOfMemoryError on a simple testMockito 在一个简单的测试中抛出 OutOfMemoryError
【发布时间】:2013-06-30 12:47:54
【问题描述】:

我尝试使用 Mockito 来模拟数据库池(仅用于检索数据),但是在运行在一段时间内检索到许多模拟连接的性能测试时,内存不足。

这是一个简化的自包含代码,它在我的机器上进行了大约 150,000 次循环迭代后抛出 OutOfMemoryError(尽管似乎没有全局保存任何内容,并且所有内容都应该是可回收的)。我做错了什么?

import static org.mockito.Mockito.when;

import java.sql.Connection;

import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

public class Test1 {

    static class DbPool {
        public Connection getConnection() {return null;}
    }

    @Mock
    private DbPool dbPool;

    @Mock
    private Connection connection;

    public Test1() {
        MockitoAnnotations.initMocks(this);
        when(dbPool.getConnection()).thenReturn(connection);

        for(int i=0;i<1000000;i++) {
            dbPool.getConnection();
            System.out.println(i);
        }
    }

    public static void main(String s[]) {       
        new Test1();
    }
}

【问题讨论】:

  • 我的内存使用量最高约为 950 MB(由Runtime.totalMemory 测量)。
  • 但是为什么它首先会用完任何内存呢?不会创建对已创建对象的全局引用,但是当您运行 GC 时,不会收集任何内容。
  • Mockito 使用其模拟类在幕后做事。我认为这是使用大部分内存的地方。

标签: java mockito heap-memory


【解决方案1】:

david-wallace 的回复解释了您遇到 OOM 的原因:模拟对象会记住每次调用的细节。

但同样重要的问题是:现在该怎么办?除了 David 已经提出的建议之外,最新的 Mockito 版本 1.10.19 以及即将推出的 2.0.x 现在支持所谓的 stubOnly 模拟(请参阅 javadoc):

stubOnly:仅存根模拟不记录方法调用,从而节省内存但不允许验证调用。

Scala 使用示例:

import org.mockito.Mockito
val list = Mockito.mock(classOf[Foo], Mockito.withSettings().stubOnly())

// The syntax is a bit more concise when using ScalaTest's MockitoSugar
val foo = mock[Foo](Mockito.withSettings().stubOnly())

Java 使用示例(未经测试):

import org.mockito.Mockito;
Foo mock = Mockito.mock(Foo.class, Mockito.withSettings().stubOnly());

【讨论】:

    【解决方案2】:

    问题在于模拟对象会记住每次调用的细节,以防您希望稍后验证它。最终,它将不可避免地耗尽内存。您需要做的是偶尔重置模拟,使用Mockito.reset 静态方法,然后再次存根您的方法。不幸的是,如果不重新设置存根,就无法清除模拟的验证信息。

    https://code.google.com/p/mockito/issues/detail?id=84 详细介绍了此问题

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-28
      • 1970-01-01
      • 1970-01-01
      • 2013-02-15
      相关资源
      最近更新 更多