私が書いているテストケース:
_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
_メソッドをモックするための正しい方法を提案してください。
静的メソッドの呼び出しを模擬するには、次の 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);
}
}
このテストは合格です。何も印刷しません。したがって、最後の静的メソッドはモックされます。