模拟Mockito 2的最后一堂课
我正在从我正在进行的项目中删除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,§Mockthe unmockable),我添加了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
我还尝试将“resources”目录放在“src”中,在一个名为“test”的子目录中,但结果仍然相同。
我认为用Mockito v2嘲笑决赛是可能的。 有人知道这里缺少什么吗?
谢谢!
很奇怪你的解决方案似乎有效。
根据他们在Github上的文件,它说。
最终类和方法的模拟是一种孵化,选择加入的function。 它使用Java代理程序检测和子类化的组合,以实现这些类型的可模拟性。 因为这与我们当前的机制不同,并且这个有不同的限制,并且因为我们想要收集经验和用户反馈,所以必须明确激活此function以使其可用; 它可以通过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());
在随后的里程碑中,团队将采用编程方式使用此function。 我们将为所有不可挽救的方案确定并提供支持。 请继续关注,请告诉我们您对此function的看法!
我的工作结构现在看起来像这样。
我无法使用配置文件; 但是,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' }
好吧,我发现这里有什么问题,对其他人来说可能有用。 我的项目树是错误的,我将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
您似乎遇到了类路径问题,就像我一样。
您以前的设置也可以使用,但似乎
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'
它会起作用。