web-dev-qa-db-ja.com

PowerMockito doNothing引数付きのメソッドの場合

Javaでアプリケーションを開発しました。Powermockitoを使用して単体テストを作成しようとしています(単体テストは初めてです)を追加する必要があります)。

ReadResourcesという静的メソッドを持つResourceというクラスがあります。

public static void readResources(ResourcesElement resourcesElement);

ResourcesElementも私によってコーディングされています。テストでは、独自のリソースを作成したいので、上記のメソッドは何もしません。私はこのコードを使用してみました:

    PowerMockito.spy(Resource.class);
    PowerMockito.doNothing().when(Resource.class, "readResources", Matchers.any(ResourcesElement.class));

単体テストは例外をスローします:

org.mockito.exceptions.misusing.UnfinishedStubbingException:未完成のスタブがここで検出されました:-> at org.powermock.api.mockito.internal.PowerMockitoCore.doAnswer(PowerMockitoCore.Java:36)

Powermockitoは、whenの後にthenReturnまたはthenThrowを使用することも推奨していますが、doNothing(論理的)の後に呼び出されると、メソッド 'when'はvoidを返すようです。私が試した場合:

PowerMockito.when(Resource.class, "readResources", Matchers.any(ResourcesElement.class)).....

doNothingはwhenの後のオプションではありません。

メソッドの2つの引数バージョンを使用して、何もしない引数なし​​のメソッドを作成することができました。例えば:

PowerMockito.doNothing().when(Moduler.class, "startProcessing");

これは機能します(startProcessingは引数を取りません)。

しかし、Powermockitoで何もしない引数をとるメソッドを作成するにはどうすればよいですか?

13
Anakin001

完全に機能する例を以下に示します。完全な例を投稿していないので、テストクラスに@RunWithまたは@PrepareForTestの注釈を付けなかったと仮定することができます。残りは問題ないと思われます。

@RunWith(PowerMockRunner.class)
@PrepareForTest({Resource.class})
public class MockingTest{

    @Test
    public void shouldMockVoidStaticMethod() throws Exception {
        PowerMockito.spy(Resource.class);
        PowerMockito.doNothing().when(Resource.class, "readResources", Mockito.any(String.class));

        //no exception heeeeere!
        Resource.readResources("whatever");

        PowerMockito.verifyStatic();
        Resource.readResources("whatever");
    }

}

class Resource {
    public static void readResources(String someArgument) {
        throw new UnsupportedOperationException("meh!");
    }
}
20
Morfic

メソッドが何もしないように、なぜそんなに多くのトラブルを経験するのでしょうか。 PowerMockito.mockStatic(Resource.class)を呼び出すだけで、クラスのすべての静的メソッドをデフォルトのスタブに置き換える必要があります。これは基本的に何もしないことを意味します。

メソッドの振る舞いを実際に変更する場合を除き、PowerMockito.mockStatic(Resource.class)を呼び出すだけで十分です。もちろん、これは、クラス内のすべての静的メソッドがスタブ化されていることを意味するため、考慮する必要があります。

4
Aniket Thakur

doNothing()が機能しない場合は、PowerMockito.doAnswer()を使用して少しハッキングできます。これにより、値の設定など、何かを行うことになっているvoidメソッドをモックできます。doNothing()が機能しない場合は、空白のdoAnswer()を使用しても問題ありません。

例:

PowerMockito.doAnswer(new org.mockito.stubbing.Answer<Object>() {
    @Override
    public Object answer(InvocationOnMock invocation) throws Throwable {
        return null; //does nothing
    }
}).when(mockObject).methodYouWantToDoNothing(args);
2
Walls

たぶん私はあなたの質問を理解することはできませんが、メソッドを実行する必要があるものを指定する必要があると信じています:

実コード:

            IPager pag;
        IPagerData<List<IDeute>> dpag;
        pag = new PagerImpl();
        pag.setFiles(nombrefilesPaginador);
        pag.setInici(1);
        dpag = gptService.obtenirDeutes(idSubjecte, idEns, tipusDeute, periode, pag);

Mockitoによる実際のコードのテスト:

        IPager pag = new PagerImpl();
        pag.setInici(1);
        pag.setFiles(0);
        when(serveiGpt.obtenirDeutes(eq(331225L),
         eq(IConstantsIdentificadors.ID_ENS_BASE), 
         Matchers.any(ETipusDeute.class),
         Matchers.any(EPeriodeDeute.class), 
         eq(pag)))
        .thenThrow(new NullPointerException(" Null!"));

リターンを指定していない場合、テストは失敗します。役に立てば幸いです。

0
ZaoTaoBao