模拟与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
- 测试
- com.packagePath.myPackage
- myClassToTest
- 资源
- 的Mockito的扩展
- org.mockito.plugins.MockMaker
- 的Mockito的扩展
- com.packagePath.myPackage
- SRC
我也试图把“资源”目录放在“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
- SRC
- 测试
- com.packagePath.myPackage
- myClassToTest
- com.packagePath.myPackage
我也无法使用配置文件工作; 然而,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'
它会工作。