gpt4 book ai didi

java - Mockito 在简单测试中抛出 OutOfMemoryError

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:59:43 25 4
gpt4 key购买 nike

我尝试使用 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();
}
}

最佳答案

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

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

stubOnly: A stub-only mock does not record method invocations, thus saving memory but disallowing verification of invocations.

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

关于java - Mockito 在简单测试中抛出 OutOfMemoryError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17437660/

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