当前位置: 首页 > 知识库问答 >
问题:

使用 Mockito 测试 Kotlin 类会导致 MissingMethodInvocationException

赵选
2023-03-14

所以在用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 . mock ITO . exceptions . mis using . missingmethodinvocationexception:when()需要一个必须是“模拟上的方法调用”的参数。比如:when(mock.getArticles())。然后返回(文章);

但是如果我把类B写成java类,即。

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

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

共有1个答案

樊俊悟
2023-03-14

Mockito在<code>final<code>类或方法方面存在问题。由于Kotlin中的所有内容都是<code>final

因此,您的Java类实际转换为静态编程语言如下所示(简化):

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

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

 类似资料:
  • 我从单元测试开始。我对一个类做了更改,在这个类中我不注入SessionContext,这样我就可以在需要时进行查找。 现在,在我的测试中,我想注入它,这样我就可以模拟查找方法: 我觉得很奇怪,因为我拥有所需的所有依赖项(这段代码在真实的应用程序中工作)。 如何使用mockito模拟和注入SessionContext?(我无法改变嘲讽框架)。

  • 使用gradle def为支持v4-r21添加多索引支持(https://plus.google.com/IanLake/posts/JW9x4pcB1rj) 现在这适用于应用程序本身,我能够构建和部署,但是当我为我的应用程序类运行机器人测试时,我从ZipUtils得到一个失败(它被MultiDex.java捕获)。其他测试运行良好。这是跟踪- 原因:java.lang.RuntimeExcept

  • 我正在使用和Spy对函数进行单元测试。 这是正在测试的类: 我正在尝试使用Mockito和spy进行测试,因为我不想调用真正的函数只需验证一下即可。该测试称为 这是错误: 我也尝试过这样做,它会导致空指针:

  • 问题内容: 我想测试一个抽象类。当然,我可以手动编写一个从类继承的模拟。 我可以使用模拟框架(我正在使用Mockito)来执行此操作,而不是手工制作模拟吗?怎么样? 问题答案: 以下建议让你在不创建“真实”子类的情况下测试抽象类-Mock 是子类。 使用,然后模拟所有被调用的抽象方法。 例: 注意:此方法的好处是,你不具备实现的抽象方法,只要他们永远不会被调用。 在我看来,这比使用间谍更整洁,因为

  • 我有下面一个班的方法。 使用mockito的junit测试用例将提供100%的代码覆盖率。

  • 我目前的解决方案是添加一个抽象函数来返回视图类,这样就可以直接在基类中模拟它: 这意味着在具体的测试类中有更多的样板代码,这在某种程度上完全违背了基本测试类的目的。这也是典型的Java解决泛型类型擦除的方法。我在想有没有更好的方法来对付科特林?(我在考虑以某种方式具体化泛型类型参数,但它们只适用于内联函数。)