web-dev-qa-db-ja.com

PowerMockito.verifyStatic()の問題

PowerMockitoを使用して、特定の静的メソッドが呼び出されるかどうかをテストする必要があります。次のPowerMockitoおよびJUnitライブラリを使用しています...

  • powermock-mockito-1.6.2-full.jar
  • junit-4.12.jar

PowerMockito.verifyStatic()メソッドを適切に動作させるのに問題があります。次のコード例では、@ PrepareForTestとmockStatic()を使用して、それらを除外してみました。コード例では、それらを含めています。

テストクラス:

import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

import org.junit.Test;
import org.junit.runner.RunWith;

@RunWith(PowerMockRunner.class)
@PrepareForTest(Test1.class)
public class PowerMockTest {
    @Test
    public void staticVerifyTest() {
        PowerMockito.mockStatic(Test1.class);

        // Test
        PowerMockito.verifyStatic();
        //Test1.staticMethod();
    }
}

テスト中のクラス:

public class Test1 {
    public static void staticMethod() {
        System.out.println("Static Method!");
    }
}

テストは実行時にパスしますが、Test1.staticMethod()が呼び出されないため、失敗するはずです。これに関するどんな助けでも大歓迎です!

9
John A Qualls

了解しました。StefanBirknerの reference のおかげでそれを理解しました。

これが私のサンプルコードの修正です:

import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

import org.junit.Test;
import org.junit.runner.RunWith;

@RunWith(PowerMockRunner.class)
@PrepareForTest(Test1.class)
public class PowerMockTest {
    @Test
    public void staticVerifyTest() {
        PowerMockito.mockStatic(Test1.class);
        // Test
        Test1.staticMethod();
        PowerMockito.verifyStatic();
        Test1.staticMethod();
    }
}

静的メソッドが呼び出された後、verifyStatic()呼び出しの後にもう一度呼び出して、静的メソッドが呼び出されたことを確認する必要があります。

つまり.

        Test1.staticMethod();
        PowerMockito.verifyStatic();
        Test1.staticMethod();

このように複数回呼び出されたかどうかを確認することもできます...

Test1.staticMethod();
Test1.staticMethod();
Test1.staticMethod();
PowerMockito.verifyStatic(Mockito.times(3));
Test1.staticMethod();
16
John A Qualls

それ自体は回答ではありませんが、A)メソッドの変更に関するOliverのコメントがPowerMock 2.0.2でも引き続き有効であることの確認と、B)動作の詳細についてのメモです。

PowerMockito.verifyStatic()呼び出しMockito.verify() Javadocにいくつかの例があります:

verify(mock, times(5)).someMethod("was called five times");
verify(mock, atLeast(2)).someMethod("was called at least two times");

この構文はもう使用できないため、検証ルールを宣言するには2行のコードが必要です。ジョンの例を使用すると、これは、最初の3行が「実際の」ビジネスコールであり、verifyStaticの後の行が、どのコールカウンターが2番目のパラメーターと一致する必要があるかを通知していることを意味します。

PowerMockito.mockStatic(Test1.class);

// Test
Test1.staticMethod();
Test1.staticMethod();
Test1.staticMethod();

// Validation
PowerMockito.verifyStatic(Test1.class, Mockito.times(3));
Test1.staticMethod();
2
Fabio

私にとって、powermockにアップグレードするときにこの問題が発生しました2.0.0-beta.5から1.7.0したがって、上記のこれらのソリューションDID NOTが私の問題の解決に役立ちます。代わりに、powermockのドキュメント( https://static.javadoc.io/org.powermock/powermock-api-mockito/1.7.1 /deprecated-list.html

だから私は行きました:

PowerMockito.verifyStatic(Mockito.times(1));

に:

PowerMockito.verifyStatic(Test1.class, Mockito.times(1));

これは、以下のライブラリを使用するときの私の問題を解決しました:

testCompile group: 'org.mockito', name: 'mockito-core', version: '2.18.0'
testCompile group: 'org.powermock', name: 'powermock-api-mockito2', version: '2.0.0-beta.5'
testCompile group: 'org.powermock', name: 'powermock-module-junit4', version: '2.0.0-beta.5'
1
Oliver Collins