无法使用PowerMockito.spy()模拟/间谍最终类

时间:2016-06-27 18:22:02

标签: powermock powermockito

我正在尝试使用PowerMockito创建final类的间谍,但我一直收到以下错误,即使我使用PowerMockito的spy()方法代替Mockito:

  

java.lang.IllegalArgumentException:无法继承最终类类com.whoever.WidgetUploadClient

我的测试用例看起来像这样:

...
import static org.powermock.api.mockito.PowerMockito.mock;
import static org.powermock.api.mockito.PowerMockito.spy;

@RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(RobolectricTestRunner.class)
@PowerMockIgnore({"org.mockito.*", "org.robolectric.*", "android.*"})
@PrepareForTest(WidgetUploadClient.class)
@Config(manifest=Config.NONE, sdk = 23)
public class WidgetUploadClientTest {
    @Test
    public void testUploadWidget() {
        WidgetMarshaller mockMarshaller = mock(WidgetMarshaller.class);
        WidgetUploadClient client = spy(new WidgetUploadClient(mockMarshaller)); // Exception thrown by spy()
        ...
    }
}

不应@PrepareForTest(WidgetUploadClient.class)使用PowerMockito spy()方法帐户WidgetUploadClient为最终版?

我还尝试了在Robolectric的PowerMock guide中找到的替代方法:使用RobolectricTestRunnerRobolectricGradleTestRunner作为测试运行符(@RunWith)和@Rule public PowerMockRule rule = new PowerMockRule()。当我这样做时,测试无法完全运行并抛出不同的异常。

我使用的是PowerMock / PowerMockito 1.6.5,Robolectric 3.1和Java 1.8.0_91-b14。

2 个答案:

答案 0 :(得分:1)

要实现这一点,您必须了解@PrepareForTest的注释,并对您的代码进行一些更改:

注释用于理解我们要测试的类,并准备该类来模拟静态,最终等等方法(因此通常不能用mockito模拟的方法)作为常规方法。

之后你必须在你的代码中执行此操作:

WidgetMarshaller mockMarshaller = mock(WidgetMarshaller.class);
//Here you are doing correcly the mocking of the object

WidgetUploadClient client = new WidgetUploadClient(mockMarshaller);
//Here you have to add this line to create an object that will be spied

client = PowerMockito.spy(client);
//Here you simply spy your class

顺便说一下,如果你通过

,还有另外一件事需要记住
@PrepareForTest(WidgetUploadClient.class)

到类中,您将能够模拟或间谍WidgetUploadClient类,因此您必须使用数组作为注释的参数将两个(或者如果您想要更多)参数传递给类,只需写下此

@PrepareForTest({WidgetUploadClient.class, WidgetMarshaller.class})

希望你得到它的工作:D 见到你

答案 1 :(得分:0)

我相信我正在使用API​​但遇到了一个错误,它会影响开发人员尝试使用Robolectric和PowerMock的组合。作为参考,可以在Robolectric的issue tracker上跟踪错误。自2016年1月(目前约6个月前)以来,图书馆的组合已被打破。