Mockito 2的模拟最终课程

2022-09-01 06:20:51

我正在从我目前正在从事的项目中删除Powermock,所以我试图只用Mockito(mockito-core-2.2.28)重写一些现有的单元测试。

当我运行测试时,我有以下错误:

org.mockito.exceptions.base.MockitoException:

无法模拟/间谍类 com。ExternalpackagePath.Externalclass

Mockito不能模拟/间谍,因为:

  • 最终课程

我知道这个问题已经被问过了(如何使用mockito模拟最终类Mock对象用Mockito调用最终类静态方法),但我没有找到我正在寻找的答案。

这是我的代码的摘录:

public class MyClassToTest extends TestCase {
    private MyClass myClass;
    @Mock private Externalclass ext;  // This class is final, I would like to mock it

    @Override
    protected void setUp() throws Exception {
        MockitoAnnotations.initMocks(this); // <<<< The exception is thrown here
        ext = Mockito.mock(Externalclass.class);
    }
}

正如Mockito文档(https://github.com/mockito/mockito/wiki/What%27s-new-in-Mockito-2,§Mock the unmockable)中提到的,我添加了org.mockito.plugins.MockMaker文件。这是我的项目树:

  • 项目
    • 来源
      • com.packagePath.myPackage
        • 我的类
    • 测试
      • com.packagePath.myPackage
        • 我的班级测试
      • 资源
        • mockito-extensions
          • org.mockito.plugins.MockMaker

我还尝试将“资源”目录放在“src”中,放在一个名为“test”的子目录中,但结果仍然是一样的。

我认为嘲笑Mockito v2的决赛是可能的。有人知道这里缺少什么吗?

谢谢!


答案 1

奇怪的是,您的解决方案似乎有效。
根据他们在Github上的文档,它说。

模拟最终的类和方法是一个孵化的、选择加入的功能。它使用 Java 代理工具化和子类化的组合,以实现这些类型的可模拟性。由于这与我们当前的机制的工作方式不同,并且该机制具有不同的限制,并且由于我们希望收集经验和用户反馈,因此必须显式激活此功能才能使用 ;它可以通过mockito扩展机制通过创建包含单行的文件来完成:src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker

mock-maker-inline

创建此文件后,Mockito将自动使用此新引擎,并且可以执行以下操作:

 final class FinalClass {
   final String finalMethod() { return "something"; }
 }

 FinalClass concrete = new FinalClass(); 

 FinalClass mock = mock(FinalClass.class);
 given(mock.finalMethod()).willReturn("not anymore");

 assertThat(mock.finalMethod()).isNotEqualTo(concrete.finalMethod());

在随后的里程碑中,团队将带来使用此功能的编程方式。我们将为所有不可接近的场景确定并提供支持。请继续关注,请让我们知道您对此功能的看法!

我的工作结构现在看起来像这样。

enter image description here


答案 2

我也无法让它与配置文件一起工作;但是,Mockito团队非常友善,还提供了一个预配置的Mockito工件,不需要在目标项目中进行配置。

为方便起见,Mockito团队提供了一个工件,其中预配置了此模拟制作器。不要使用 mockito 核心工件,而是在项目中包含 mockito 内联工件。请注意,一旦对最终类和方法的模拟集成到默认模拟制作器中,此工件可能会停止。

因此,如果您使用 Gradle 并希望测试 Kotlin 代码,只需将其添加到项目的依赖项中即可:

testCompile 'org.mockito:mockito-inline:2.8.9'
testCompile('com.nhaarman:mockito-kotlin:1.5.0') {
    exclude group: 'org.jetbrains.kotlin'
    exclude group: 'org.mockito'
}

推荐