HarryQ:
Kotlinに切り替える場合、静的メソッドは、コンパニオン・オブジェクトに移動されます。しかし、これらの「静的メソッド」を呼び出す単体テスト他の方法には明白な方法はありません。
Javaでは、私たちは、静的メソッドはテスト対象のメソッドで呼び出さされていることを確認するためにPowerMockitoのMockStatic(SomeClass.class)を使用することができます。PowerMockはKotlinでその魔法を失います。
テストのために、私は以下のクラスを作成しています。
public class DummyJava {
static public Void staticMechod(){
System.out.print("Dummy method is called");
return null;
}
}
class DummyCompanion {
companion object {
fun someCompanionMethod(){
System.out.printf("companion method is called\n")
}
}
}
今呼び出して別のクラスがあります DummyCompanion.someCompanion
public class DummyWrapper {
public void callAStaticMethod(){
DummyJava.staticMechod();
}
public void callCompanionMethod(){
DummyCompanion.Companion.someCompanionMethod();
}
}
ユニットテストにcallAStaticMethod()
私たちは次のように使用しました
@RunWith(PowerMockRunner.class)
@PrepareForTest({DummyJava.class, DummyCompanion.Companion.class})
public class staticClassTest {
//This case works
@Test
public void testForStaticMethod() {
PowerMockito.mockStatic(DummyJava.class);
DummyWrapper testObject = new DummyWrapper();
Mockito.when(DummyJava.staticMechod()).thenCallRealMethod();
testObject.callAStaticMethod();
PowerMockito.verifyStatic(Dummy.class);
DummyJava.staticMechod();
}
//This case doesn't work. It always passes.
@Test
public void testForCompanionMethod() {
PowerMockito.mockStatic(DummyCompanion.Companion.class);
DummyWrapper testObject = new DummyWrapper();
testObject.callCompanionMethod();
PowerMockito.verifyStatic(DummyCompanion.Companion.class,Mockito.times(1));
DummyCompanion.Companion.someCompanionMethod();
}
私の質問は、メソッドが呼び出されたコンパニオンを確認する方法です。
HarryQ:
解決策1:呼び出しクラスで、呼び出し元の関数を追加
public class DummyWrapper {
val foo get() = DummyCompanion.Companion
public void callAStaticMethod(){
foo.staticMechod();
}
public void callCompanionMethod(){
foo.someCompanionMethod();
}
}
テストクラスでは、我々はのためのスタブを提供するために、Mockitoを使用することができますget()
機能と、それが呼び出される検証しました。
@Test
fun testCase{
....
val mockCompanionObj: DummyCompanion.Companion = mock()
val wrapper = DummyWrapper()
whenever(wrapper.foo).thenReturn(mockCompanionObj)
wrapper.callCompanionMethod()
verify(mockCompanionObj).someCompanionMethod()
....
}
解決策2:Mockk使用 Mockkでモッキングコンパニオンオブジェクトは簡単です。ソースコードにテストのインタフェースオブジェクトを挿入する必要はありません。
@Test
fun testCompanionObject() {
//Mock the companion object
mockkObject(DummyCompanion.Companion)
//define the stubbing bechavior of a companion object method
every { DummyCompanion.Companion.companionMethod() } answers { stubMethod() }
val testObject = DummyWrapper()
//Call a method that calls the companion object method
//You can verify stubMethod() is called
testObject.callCompanionMethod()
verify(exactly = 1) { DummyCompanion.someCompanionMethod() }
}
詳細については参照Mockkを