web-dev-qa-db-ja.com

最終クラスのPowermock静的最終メソッド

私が書いているテストケース:

_public class AClassUnderTest {

    // This test class has a method call
    public Long methodUnderTest() {

         // Uses the FinalUtilityClass which contains static final method
         FinalUtilityClass.myStaticFinalMethod(<3-parameters-here>);

         // I want to mock above call so that test case for my "methodUnderTest" passes
    }
}
_

最終クラスが1つあります。

_public final class FinalUtilityClass {

   /**
    * Method has 3 parameters
    */
   public static final MyBean myStaticFinalMethod(<3-parameters-here>) {

   }
}
_

私はすでにテストクラスに以下のコードを追加しています:

_@RunWith(PowerMockRunner.class)
@PrepareForTest({ FinalUtilityClass.class })
_

それをあざけるためのテストケースを書きたいのですが。 myStaticFinalMethod()の呼び出しをモックしたいので、テストケースをパスするための追加のコードで使用できるMyBeanインスタンスを取得できます。

_<3-parameters-here>_は、Calendar、String、Stringです。

私がやってみました

1)

_PowerMockito.mock(FinalUtilityClass.class)
PowerMockito.when(FinalUtilityClass.myStaticFinalMethod(<3-parameters-here>).thenReturn(new MyBean());
_

2)

_PowerMockito.mockStatic(FinalUtilityClass.class)
PowerMockito.when(FinalUtilityClass.myStaticFinalMethod(<3-parameters-here>).thenReturn(new MyBean());
_

_PowerMockito.spy(FinalUtilityClass.class)
PowerMockito.when(FinalUtilityClass.myStaticFinalMethod(<3-parameters-here>).thenReturn(new MyBean());
_

しかし、私には何もうまくいきませんでした。 finalクラスの_static final_メソッドをモックするための正しい方法を提案してください。

5
Mandar Pandit

静的メソッドの呼び出しを模擬するには、次の steps が必要です。

  • テストケースのクラスレベルで@RunWith(PowerMockRunner.class)アノテーションを使用します。
  • テストケースのクラスレベルで@PrepareForTest(ClassThatContainsStaticMethod.class)アノテーションを使用する
  • PowerMock.mockStatic(ClassThatContainsStaticMethod.class)を使用して、このクラスのすべてのメソッドをモックします

記載されている手順を実行すると、テストが機能するはずです。そして、OPはPowerMockとPowerMockitoについて混乱しているようです-これは(多かれ少なかれ)同じことです:

PowerMockおよびPowerMockitoは、sameテクノロジーに基づいています。 EasyMockまたはMockitoのどちらかで動作するように、「コネクター」が異なるだけです。つまり、上記の例ではPowerMock.mockStatic()と言っていますが、 PowerMockito にはmockStatic()メソッドもあります。その意味で:coreのこと(たとえば、準備に関する注釈)は同じです。 ここ の例を参照してください(リンクが非常に近いため、リンクされたチュートリアルで「Intro to PowerMock」と記載されていますが、PowerMockitoが紹介されています。

そして、あなたは私を信じていないようです-この例を見てください:

package ghostcat.test;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

final class ClassWithStatic {
    public final static int ignoreMethodCall(String a, String b, int c) {
        System.out.println("SHOULD NOT SHOW UP: " + a);
        return c;
    }
}

@RunWith(PowerMockRunner.class)
@PrepareForTest(ClassWithStatic.class)
public class MockStaticTest {
    @Test
    public void test() {
        PowerMockito.mockStatic(ClassWithStatic.class);
        PowerMockito.when(ClassWithStatic.ignoreMethodCall("a", "b", 5)).thenReturn(42);
        org.junit.Assert.assertEquals(ClassWithStatic.ignoreMethodCall("a", "b", 5), 42);
    }
}

このテストは合格です。何も印刷しません。したがって、最後の静的メソッドはモックされます。