使用 Mockito 2 模拟最后一堂课

新手上路,请多包涵

我正在从我目前正在处理的项目中删除 Powermock,因此我试图仅使用 Mockito (mockito-core-2.2.28) 重写一些现有的单一测试。

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

org.mockito.exceptions.base.MockitoException:

不能模拟/间谍类 com.ExternalpackagePath.Externalclass

Mockito 不能模拟/间谍因为:

  • 最后一堂课

我知道已经有人问过这个问题( How to mock a final class with mockitoMock objects calling final classes static methods with 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
        • myClassToTest
      • 资源
        • 模拟扩展
        • org.mockito.plugins.MockMaker

我也尝试将“resources”目录放在“src”中,在一个名为“test”的子目录中,但结果仍然相同。

我认为使用 Mockito v2 可以模拟决赛。有人知道这里缺少什么吗?

谢谢!

原文由 Ptiseb 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 461
2 个回答

好吧,我发现这里出了什么问题,它可能对其他人有用。我的项目树是错误的,我将 org.mockito.plugins.MockMaker 直接放在“src”中的目录“mockito-extension”中。现在这是我的树:

  • 项目
    • 来源
      • com.packagePath.myPackage
        • 我的课
      • 模拟扩展
        • org.mockito.plugins.MockMaker
  • 测试
    • com.packagePath.myPackage
      • myClassToTest

原文由 Ptiseb 发布,翻译遵循 CC BY-SA 3.0 许可协议

奇怪的是您的解决方案似乎有效。

根据他们在 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());

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

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

在此处输入图像描述

原文由 timr 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题