java - 使用 Mockito 测试 Kotlin 类会导致 MissingMethodInitationException

标签 java android unit-testing kotlin mockito

因此,在对 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/

相关文章:

java - 在 Eclipse 中运行服务器时的 Jboss 问题

java - 我可以使用 java HtmlUnit 库从 linkedIn 中提取信息吗?

java - 单词计数中Mapper <K1,V1,K2,V2>中K1和K2的用途是什么?

Android项目导入模块后无法使用gradle构建

android - 使用 FFmpeg 合并 2 个 mp3 文件

android - 如何在android中使用自签名证书注册的https链接?

javascript - 在 chai 中测试错误类型

ruby-on-rails - rails 3 测试用例 error.on( :field) Vs. 错误 [:field]

c# - 使用 AutoFixture 创建递归树

java - 任何好的 Java Swing 时间轴小部件?