12

特定の静的メソッドが呼び出されているかどうかをテストするには、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() が呼び出されないため失敗するはずです。これに関する助けがあれば大歓迎です!

4

4 に答える 4

25

よし、Stefan Birknerのリファレンスのおかげで理解できた

サンプルコードの修正は次のとおりです。

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();
于 2015-10-07T18:38:42.550 に答える
1

バージョン 2.0.7 と Mockito 2.28.2 または 3.3.3 を使用し、以下のように定義されたテストを使用するpowermock-api-mockito2と、「TooManyActualInvocations: Wanted 1 time but was 2 times.」というエラーが発生し続けました。powermock-module-junit4

public class StaticClass {
  // Note: void method with arguments
  public static void doSomething(final String arg) {
    doSomethingElseWithArg(arg);
  }
}

public class ClassUnderTest {
  public void doWork(String arg) {
    StaticClass.doSomething(arg);
  } 
}

@RunWith(PowerMockRunner.class)
@PrepareForTest(StaticClass.class)
public class MyTest {
  ClassUnderTest tester = new ClassUnderTest();

  @Test 
  public void myStaticTest() throws Exception {
    PowerMockito.mockStatic(StaticClass.class);
    StaticClass.doSomething("hello");  // won't work

    tester.doWork("hello");

    PowerMockito.verifyStatic(StaticClass.class);
    StaticClass.doSomething("hello"); // TooManyActualInvocations 
  }
}

元のコードがメソッドを 2 回呼び出していないこと、多くのドキュメントの読み取り、および多くのバニー トレイルを再確認した後、ようやく動作するようになりました。代わりに、テスト メソッドは次のようにする必要がありました。

@Test 
public void myStaticTest() throws Exception {
  PowerMockito.mockStatic(StaticClass.class);
  PowerMockito.doNothing().when(StaticClass.class, "doSomething", "hello"); 

  tester.doWork("hello");

  PowerMockito.verifyStatic(StaticClass.class);
  // specify the method and the args expected in the call
  StaticClass.doSomething("hello");
}

次の人のために記録しているので、これを理解するのにとても時間がかかりました。

于 2020-07-08T00:02:50.570 に答える