2016-07-25 2 views
4

私は〜800テストのJUnitテストスイートを持っています。これらのほとんどはSpringに接続されており、多数の人がMockitoを使って行動を擬似/スパイしています。私は、メモリ不足の問題に遭遇しました。 hprofダンプを解析している間に、私はヒープの30%以上がテスト間で保持されているMockito InvocationImplsによって消費されていることに気付きました。Mockito InvocationImplはTestSuiteテスト全体で保持されます

テストクラスの完了後にこれらをクリアする方法はありますか? mockito.reset(mock)を使用したくないのは、各テストごとにモックの初期化が異なるからです。もしそうでなければ、漏れに対応するためにテストを分割する必要があるようです。

this linkから、Mockitoチームは、これらが実行後の検証アプローチのトレードオフとして保持されていると認識しているようです。しかし、誰かがこれらをクリアする手段を見つけたのかどうか疑問に思っているので、たくさんの単体テストをスイートで一緒に繋げることができます。

答えて

2

部分的な回避策が見つかりました。私のケースでは、InvocationImplインスタンスの大部分が、spy()を使ってリアルパーシャルモックを作成して1つのメソッドをオーバーライドできる単一のテストケースで作成されていました。私はMockito 1.10.19を使用しているので、部分模擬工事をspy()からmock(<class>, withSettings().spiedInstance(realInstance).defaultAnswer(CALLS_READ_MATHODS).stubOnly())に変更しました。

がこの模擬でverify()の使用を防止しながら、stubOnly()は、試験中にスパイに行われた各呼に対してInvocationImplのインスタンスを格納するからモックを保持し、そして有意ヒープ使用を減少させました。

私のモックは通常、SpringのコンテキストファイルでSpringockitoで作成されているので、次のようにmock()呼び出しと一致するようにBean定義の醜いリワークが必要でした。しかしこれは、スパイをSpring-wiredドメインクラスで使用することを可能にします。

<bean id="realInstance" class="<Real Instance Class>" /> 
    <bean id="instSpySettings" class="org.mockito.Mockito" factory-method="withSettings" /> 
    <bean id="instSpyPartialMock" factory-bean="instSpySettings" factory-method="spiedInstance"> 
    <constructor-arg> 
     <ref local="realInstance" /> 
    </constructor-arg> 
    </bean> 
    <bean id="instSpyDefaultAnswers" factory-bean="instSpyPartialMock" factory-method="defaultAnswer"> 
    <constructor-arg><util:constant static-field="org.mockito.Mockito.CALLS_REAL_METHODS"/></constructor-arg> 
    </bean> 
    <bean id="instSpyStubOnly" factory-bean="instSpyDefaultAnswers" factory-method="stubOnly" /> 
    <bean id="spyInstance" class="org.mockito.Mockito" factory-method="mock"> 
    <constructor-arg value="<Real Instance Class>" /> 
    <constructor-arg> 
     <ref local="instSpyStubOnly" /> 
    </constructor-arg> 
    </bean> 
関連する問題