当切换到 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();
}
我的问题是如何验证调用了伴随方法。
解决方案1:在调用类中添加调用者函数
class DummyWrapper {
val foo get() = DummyCompanion.Companion
fun callAStaticMethod() {
foo.staticMethod()
}
fun 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 behavior of a companion object method
every { DummyCompanion.someCompanionMethod() } 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 https://mockk.io
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)