模拟与Mockito 2最后一课

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

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

org.mockito.exceptions.base.MockitoException:

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

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,§Mockunmockable ),我添加了org.mockito.plugins.MockMaker文件。 这是我的项目的树:

  • 项目
    • SRC
      • com.packagePath.myPackage
        • 我的课
    • 测试
      • com.packagePath.myPackage
        • myClassToTest
      • 资源
        • 的Mockito的扩展
          • org.mockito.plugins.MockMaker

我也试图把“资源”目录放在“src”中,名为“test”的子目录中,但结果仍然是一样的。

我认为用Mockito v2嘲笑最后的结果是可能的。 有人知道这里缺少什么吗?

谢谢!

奇怪你的解决方案似乎工作。
据他们在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()); 

在随后的里程碑中,团队将带来使用此功能的程序化方式。 我们将确定并提供对所有不可调试场景的支持。 敬请期待,请让我们知道您对此功能的看法!

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

在这里输入图像描述

那么,我发现这里有什么不对,对其他人可能有用。 我的项目树是错的,我把org.mockito.plugins.MockMaker直接放在“src”目录下的“mockito-extension”中。 现在这是我的树:

    • SRC
      • com.packagePath.myPackage
        • 我的课
      • 的Mockito的扩展
        • org.mockito.plugins.MockMaker
  • 测试
    • com.packagePath.myPackage
      • myClassToTest

我也无法使用配置文件工作; 然而,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' } 

你似乎有一个类路径问题,就像我一样。

你以前的设置也会起作用,但看起来像

 project/test/resources 

不在你的类路径中。

当我试图用IntelliJ运行这个时遇到同样的问题。 我简单地将资源目录标记为测试资源根,它工作正常。 赞美Mockito的神!

这个解决方案为我工作:而不是

 testCompile "org.mockito:mockito-android:2.9.0" 

在gradle文件中,将其替换为

 testCompile group: 'org.mockito', name: 'mockito-inline', version: '2.9.0' 

它会工作。