无法使用 PowerMockito.spy() 模拟/监视最终类



我正在尝试使用 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指南中的替代方法:使用RobolectricTestRunnerRobolectricGradleTestRunner作为测试运行器(@RunWith)与@Rule public PowerMockRule rule = new PowerMockRule()。当我这样做时,测试无法完全运行,并抛出不同的异常。

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

要使其正常工作,您必须了解注释@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 再见

我相信我正确地使用了API,但遇到了一个错误,该错误影响了尝试使用Robolectric和PowerMock组合的开发人员。作为参考,可以在Robolectric的问题跟踪器上跟踪该错误。至少从 2016 年 1 月(目前 ~6 个月前)开始,库的组合就被打破了。

相关内容

  • 没有找到相关文章

最新更新