8

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

2 に答える 2

19

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());
于 2015-03-03T14:01:09.340 に答える