【问题标题】:Testing Kotlin classes with Mockito causes MissingMethodInvocationException使用 Mockito 测试 Kotlin 类会导致 MissingMethodInvocationException
【发布时间】:2019-01-04 16:49:26
【问题描述】:

所以在对 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.MissingMethodInvocationException: when() 需要一个参数,该参数必须是“模拟方法调用”。 例如: when(mock.getArticles()).thenReturn(articles);

但是如果我将 B 类写为 java 类,即

public class B {
    public String provideValue(){
        return "b";
    }
}

测试有效。 有人可以解释为什么会发生这种情况,或者当 mockito 不能始终如一地工作时我应该如何测试 kotlin 代码。

【问题讨论】:

    标签: java android unit-testing kotlin mockito


    【解决方案1】:

    Mockito 在final 类或方法方面存在问题。由于 Kotlin 中默认情况下所有内容都是 final,因此您需要编写 open fun provideValue() : String 或使用另一个模拟库或完全跳过模拟;-)

    所以你的 Java 类实际翻译成 Kotlin 看起来如下(简化):

    open class B {
      open fun provideValue() = "b"
    }
    

    就在今天,我听说了mockk,并尝试了您的示例。有了这个库,您将不需要仅仅为了测试目的而打开您的类和方法,所以您可能想看看它。

    【讨论】:

    • 天哪。我现在脑子里一片混乱。我认为开放课程将使所有功能都起作用。谢谢你的朋友,一旦定时器阻塞用完,就会接受它作为正确答案。
    • 没问题。我更新了答案,因为mockk 可能对你很感兴趣。
    猜你喜欢
    • 1970-01-01
    • 2018-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    相关资源
    最近更新 更多