web-dev-qa-db-ja.com

PowerMockitoでシングルトンをモックする

私がコーディングしたプライベートメソッドの1つをテストするには、シングルトンをモックする必要があります。

PowerMockitoでいくつかのメソッドをテストした後:

PowerMockito.mockStatic(UtilDatabaseSoldeAutoCdeCommon.class);
Mockito.when(UtilDatabaseSoldeAutoCdeCommon.getInstance()).thenReturn(mockDatabase);

私はこのクラスをあざけることはできませんでした。したがって、すべてのメソッドのようにメソッドをテストすることはできません。データベースにアクセスします。

UtilDatabaseSoldeAutoCdeCommonは次のように定義されています:

public class UtilDatabaseSoldeAutoCdeCommon extends AbstractUtilDatabase {

private static UtilDatabaseSoldeAutoCdeCommon instance;

private UtilDatabaseSoldeAutoCdeCommon() {
    super();
}

public static UtilDatabaseSoldeAutoCdeCommon getInstance() {
    if(instance == null) {
        instance = new UtilDatabaseSoldeAutoCdeCommon();
    }
    return instance;
}

...
}

GetInstance()を呼び出すときにpowermockitoをデバッグしましたが、consructorが呼び出されるたびに、構成ファイル(存在しない)を読み込もうとするとクラッシュします。

設定ファイルは、UtilDatabaseEnrichissementのabsract親クラスの定数として定義され、コンストラクターで使用されることを正確に示しています。

この部分をどのようにテストできますか?

9
Biologeek

私はこれがうまくいくと思います:

    @PrepareForTest({UtilDatabaseSoldeAutoCdeCommon.class})
    public class SomeTest {
        @Mock
        UtilDatabaseSoldeAutoCdeCommon fakeSingletonInstance;   

        @Test
        public void test() {
             Whitebox.setInternalState(UtilDatabaseSoldeAutoCdeCommon.class, "instance", fakeSingletonInstance);
             // Write here your test
        }
    }
14
asch

この質問はずっと前に尋ねられました、そして、私は同様の問題に直面していて、良い答えを見つけることができなかったので、今それに答えます。私は次のようなコンストラクタを抑制してクラスをテストしました

PowerMockito.suppress(UtilDatabaseSoldeAutoCdeCommon.class.getConstructors());

1
Mahesh

PrepareForTestモックするシングルトンクラス

0
Slava Shpitalny