Powermockito模拟静态方法返回Mockito.mock

时间:2016-10-19 09:03:47

标签: mocking powermockito

我已经得到了这段代码,我想用powermockito进行模拟:

long size = FileUtility.getFileFromPath(uri.getPath()).length())

这种静态方法的实现很简单:

public static File getFileFromPath(String filePath) {
    return new File(filePath);
}

现在,当我在测试中编写这段代码时,测试失败了。

PowerMockito.mockStatic(FileUtility.class);
File fileMock = mock(File.class);
PowerMockito.when(FileUtility.getFileFromPath(anyString())).thenReturn(fileMock);
Mockito.doReturn(12).when(fileMock.length());

有这个例外:

org.mockito.exceptions.misusing.UnfinishedStubbingException: 
Unfinished stubbing detected here:
-> at nl.mijnverzekering.entities.declareren.NotaPdfMetadataTest.mockFileSize(NotaPdfMetadataTest.java:273)

E.g. thenReturn() may be missing.
Examples of correct stubbing:
    when(mock.isOk()).thenReturn(true);
    when(mock.isOk()).thenThrow(exception);
    doThrow(exception).when(mock).someVoidMethod();
Hints:
 1. missing thenReturn()
 2. you are trying to stub a final method, you naughty developer!
 3: you are stubbing the behaviour of another mock inside before 'thenReturn' instruction if completed

之前我已经看过错误(我应该将 mock(File.class)提取到一个单独的变量,就像我现在做的那样)。 这里出了什么问题?是因为我使用模拟对象作为返回值吗?怎么解决?

解决方案解决方案: 当然,如果我将此方法添加到FileUtility中,我的测试将会成功:

public static long getFileSizeFromFilePath(String filePath) {
    return getFileFromPath(filePath).length();
}

然后简单地

    PowerMockito.mockStatic(FileUtility.class);
    PowerMockito.when(FileUtility.getFileSizeFromFilePath(anyString())).thenReturn(size);

但是我想阻止在我的FileUtility中添加那些不必要的方法列表(并理解异常的原因)

1 个答案:

答案 0 :(得分:0)

  

这里出了什么问题?是因为我使用的是模拟对象   回报价值?怎么解决?

这一行错了:

null

签名是Mockito.doReturn(12).when(fileMock.length()); ,因此应该传递模拟,但不是方法调用:

T when(T mock)

这也可行:

Mockito.doReturn(12L).when(fileMock).length();