模拟toURI()方法时出现AssertionFailedError

时间:2018-08-30 15:29:08

标签: java unit-testing exception mockito

我正在尝试从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中进行了测试,问题仍然存在。

有人知道这是怎么回事吗?

1 个答案:

答案 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将能够模拟最终方法。