Har*_*ryQ 10 java unit-testing kotlin
当切换到 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")
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在有另一个类调用 DummyCompanion.someCompanion
public class DummyWrapper {
public void callAStaticMethod(){
DummyJava.staticMechod();
}
public void callCompanionMethod(){
DummyCompanion.Companion.someCompanionMethod();
}
}
Run Code Online (Sandbox Code Playgroud)
单元测试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();
}
Run Code Online (Sandbox Code Playgroud)
我的问题是如何验证调用了伴随方法。
Har*_*ryQ 12
方案一:在调用类中添加调用函数
public class DummyWrapper {
val foo get() = DummyCompanion.Companion
public void callAStaticMethod(){
foo.staticMechod();
}
public void callCompanionMethod(){
foo.someCompanionMethod();
}
}
Run Code Online (Sandbox Code Playgroud)
在测试类中,我们可以使用 Mockito 为get()函数提供一个存根并验证它是否被调用。
@Test
fun testCase{
....
val mockCompanionObj: DummyCompanion.Companion = mock()
val wrapper = DummyWrapper()
whenever(wrapper.foo).thenReturn(mockCompanionObj)
wrapper.callCompanionMethod()
verify(mockCompanionObj).someCompanionMethod()
....
}
Run Code Online (Sandbox Code Playgroud)
解决方案 2: 在 Mockk 中使用 Mockk Mocking 伴生对象很容易。无需在源代码中插入测试接口对象。
@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() }
}
Run Code Online (Sandbox Code Playgroud)
有关详细信息,请参阅Mockk
你也可以用 PowerMock 这样做,它会是这样的:
@RunWith(PowerMockRunner.class)
@PrepareForTest({DummyCompanion.class})
public class staticClassTest {
@Test
public void testForCompanionMethod() {
PowerMockito.mockStatic(DummyCompanion.class);
DummyCompanion.Companion companionMock = PowerMockito.mock(DummyCompanion.Companion.class);
Whitebox.setInternalState(
DummyCompanion.class, "Companion",
companionMock
);
DummyWrapper testObject = new DummyWrapper();
testObject.callCompanionMethod();
Mockito.verify(companionMock,Mockito.times(1)).someCompanionMethod();
}
}
Run Code Online (Sandbox Code Playgroud)
Kotlin 为 Java(在 Kotlin 类中,DummyCompanion在这种情况下)创建了一个名为 Companion 子类的静态字段Companion,可以使用 PowerMock 的WhiteBox.setInternalState工具将其设置为模拟Companion实例,您可以稍后验证方法调用。
| 归档时间: |
|
| 查看次数: |
9865 次 |
| 最近记录: |