因此,在对 kotlin 类进行大量尝试和错误之后,我发现 java 中的相同代码是可测试的,但不能用 kotlin 进行测试。
@RunWith(MockitoJUnitRunner.class)
public class TestStuff {
@Mock
B b;
@Test
public void testStuff(){
A a = new A(b);
Mockito.when(b.provideValue()).thenReturn("");
a.doStuff();
}
}
class A(val b: B) {
fun doStuff() {
b.provideValue()
}
}
open class B {
fun provideValue(): String {
return "b"
}
}
这会导致:org.mockito.exceptions.misusing.MissingMethodInitationException: when() 需要一个参数,该参数必须是“模拟上的方法调用”。 例如: when(mock.getArticles()).thenReturn(articles);
但是如果我将 B 类编写为 java 类,即
public class B {
public String provideValue(){
return "b";
}
}
测试有效。 有人可以解释一下为什么会发生这种情况,或者当mockito不能一致工作时我应该如何测试kotlin代码。
最佳答案
Mockito 在 final
类或方法方面存在问题。由于 Kotlin 中默认情况下一切都是 final
,因此您需要编写 open fun ProvideValue() : String
或使用另一个模拟库或完全跳过模拟;-)
因此,您的 Java 类实际上已转换为 Kotlin,如下所示(简化版):
open class B {
open fun provideValue() = "b"
}
就在今天我听说了 mockk我尝试了你的例子。有了这个库,您将不需要仅仅为了测试目的而打开您的类和方法,因此您可能想看一下它。
关于java - 使用 Mockito 测试 Kotlin 类会导致 MissingMethodInitationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51560031/