我正在尝试从toURI()
类(该类属于FileObject.java
包)中模拟org.openide.filesystems
方法。
方法声明如下:
public final URI toURI() {
// Compiled code
}
到目前为止,我有以下测试代码:
@Test
public void test() throws Exception {
String myUrl = "http://stackoverflow.com";
URI myURI = new URI(myUrl);
FileObject mocked = Mockito.mock(FileObject.class);
Mockito.when(mocked.toURI()).thenReturn(myURI);
assertEquals(myURI, mocked.toURI());
}
但是,当我运行测试时,它在Mockito.when(mocked.toURI()).thenReturn(myURI);
行中崩溃,并显示以下错误:
测试用例:test(myapp.logicLayer.LogicTest):失败文件对象模拟 对于FileObject,hashCode:443290224从getFileSystem()返回null junit.framework.AssertionFailedError:FileObject的File对象模拟, hashCode:443290224从getFileSystem()返回null
我尝试了多种解决方法,但是找不到任何可行的方法。
我什至尝试使用PowerMockito.stub(PowerMockito.method(FileObject.class, "toURI")).toReturn(myURI);
,但遇到相同的错误,更不用说应该在静态方法中使用了,不是这种情况。
我正在使用Mockito 1.10.19。我四处搜寻,设法看到只有Mockito的版本2才能模拟最终方法。我的猜测是这可能是问题所在,但我真的不确定。
编辑:刚刚在Mockito 2.8.9中进行了测试,问题仍然存在。
有人知道这是怎么回事吗?
答案 0 :(得分:3)
之所以发生此问题,是因为这是一种最终方法。
因为Mockito 2.1.0可以模拟最终方法/类。来自Mockito documentation:
很长一段时间,当Mockito拒绝时,我们的用户都难以置信 模拟最后一堂课。最终方法的模拟甚至更多 有问题的,导致框架的令人惊讶的行为和 产生愤怒的故障排除。缺乏模拟决赛是 Mockito自2007年成立以来的主要局限性(...) 可以通过创建文件通过模仿扩展机制来完成 src / test / resources / mockito-extensions / org.mockito.plugins.MockMaker
为实现最终方法模拟,您应该创建包含单行的文件src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker
:
mock-maker-inline
mockito将能够模拟最终方法。