5

テストのためにクラスをマックする必要があります。問題は、class(UpdateManager)コンストラクターが5つの引数を取るサードパーティのライブラリを使用していることです。つまり、1つのjava.sql.Connectionとその他は文字列です。そのコンストラクター内で、コンストラクター引数を接続とし​​て渡すことにより、1つのクラスinstance(DataSource)を作成します。そのデータソースインスタンスでは、ストアドプロシージャを呼び出すメソッドの1つを呼び出します。私の問題は、モック接続でこれらの5つのパラメーターを渡すことにより、UpdateManagerの部分的なモックを作成しましたが、コンストラクター内でDataSourceのメソッドを呼び出すと、nullポインター例外がスローされます。以下に示すことにより、データソースをスタブする前に

Mockito.doNothing().when(dataSource).update(
Mockito.any(DataSource.class),  Mockito.any(ArrayList.class), Mockito.anyInt());

それでも、コンストラクターがDataSourceの新しいインスタンスを作成するたびに、NullPointExceptionがスローされます。このシナリオで、db接続がスタブ例外またはdoNothingをスローするだけでそれをモックする方法を教えてください。MOCKITOを使用しました。これにプロキシパターンを使用するより良い解決策はありますか。

あなたの提案は高く評価されます。

4

1 に答える 1

2

はい、プロキシ クラスは、サード パーティ クラスに関するこの種の問題を解決する 1 つの方法です。その後、サードパーティのクラスの代わりにプロキシ クラスを単純にモックすることができます。このアプローチの欠点は、テストをサポートするためだけに、これらの追加のラッパー クラスが必要になることです。

UpdateManagerこの特定のケースでは、これらのオブジェクトの作成に関心があるため、Factory クラスを追加してプロキシとして機能させることが有益な場合があります。

public class UpdateManagerFactory {

    public UpdateManager createInstance(... args...) {
        return new UpdateManager(... args...);
    }
}

依存性注入に Spring などを使用している場合、この Factory がアプリケーション コンテキストでシングルトン Bean であることを回避できるため、それを作成する必要がありますstatic。この Factory を静的にしたい場合は、powermockitoを使用してモックすることができます。

ヒント: アプリケーションのテストを容易にするために、恐れずにコードを追加してください。


コメントに従って編集

Factory クラスに spy() を使用しないでください。代わりにモックしてください

public void myTest() {

    Foo classUnderTest = new Foo();

    UpdateManagerFactory umf = mock(UpdateManagerFactory.class);

    UpdateManager um = mock(UpdateManager.class);

    when(umf.createInstance()).thenReturn(um);

    // perform test that will call umf.createInstance() at some point
    classUnderTest.doSomething();

    // verify + assert on "umf" and "um"

}
于 2013-02-07T12:56:58.033 に答える