2

現在、かなり大規模なプロジェクトでいくつかの単体テストでメモリの問題が発生しています。今日の私の髪の引っ張りと研究を通して、私は、オブジェクトがクリーンアップされるべきだと思うほど速くクリーンアップされていないことに関連しているように見えることに気づきました. 私は「cleanup mockito」と「cleanup junit」の調査を開始し、いくつかのブログとフォーラムの投稿に出くわしました。使用方法@Before@After(およびそれらの *Class バージョン) を使用して、すべてのユニットで実行したくない激しいことを行う方法についてです。テスト。これにより、Mockito@Mock@InjectMocks注釈について考えるようになりました。

Mavenビルド中に以下のクラス変数がメモリ内でどのように処理されているかを詳しく説明してもらえますか? オブジェクトは、単体テストの前、最中、または後に作成されますか? 最後の単体テストが完了した後、オブジェクトはすぐに破棄されますか? @Afterすべてのクラス変数を null に設定するために使用する必要がありますか?

何度もありがとう。以下は、私が使用する可能性のあるテスト ケースのサンプルです。

@RunWith(MockitoJUnitRunner.class)
public class thisCustomTest {

    @Mock
    MyCustomSpringBean myCustomerSpringBean;

    @InjectMocks
    MyBeanToTest myBeanToTest;

    @Before
    public void config() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void someTest() {
        //code here
    }

}

最後に簡単なまとめ/要約を行うために、私の主な質問は、@Afterクラス変数をクリーンアップするようなものを利用する必要があるかどうか、またはJavaの通常のスコープのガベージコレクションのためにそのままにしておく必要があるかどうかです...

クリーンアップの私の考え:

@After
public void cleanup() {
    mockedClassVariable = null;
    injectedVariable = null;
}
4

1 に答える 1

6

JUnit は、各テスト メソッドを実行する前に、単体テスト クラスの新しいインスタンスを作成します。インスタンスが作成されると、その@Before注釈付きメソッドが実行されます。次に、テストメソッドが実行されます。次に、テスト メソッドで何が起こっても (成功、失敗、またはエラー)、@After アノテーション付きメソッドが実行されます。

そのため、この特定のケースでMockitoAnnotations.initMocks(this)は、各テスト メソッドの前に が実行され、毎回新しいモックと新しい MyBeanToTest が作成され、テストする Bean にモックが挿入されます。

これらの Bean は、テスト メソッドの実行後に、それらを参照するテスト インスタンスとともに GC の対象となります。cleanup メソッドでそれらを null に設定しても、何の目的もありません。

于 2013-07-25T07:07:07.430 に答える