无法使用 PowerMockito.spy() mock/spy 最终 class
Cannot mock/spy final class using PowerMockito.spy()
我正在尝试使用 PowerMockito 创建一个 final
class 的间谍,但我不断收到以下错误,即使我正在使用 PowerMockito 的 spy()
方法Mockito 的:
java.lang.IllegalArgumentException: Cannot subclass final class class 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 中的替代方法:使用 RobolectricTestRunner
或 RobolectricGradleTestRunner
作为测试 运行ner (@RunWith
) 和 @Rule public PowerMockRule rule = new PowerMockRule()
。当我这样做时,测试完全失败 运行 并抛出一个不同的异常。
我正在使用 PowerMock/PowerMockito 1.6.5、Robolectric 3.1 和 Java 1.8.0_91-b14.
要实现此功能,您必须了解注释 @PrepareForTest 的作用并对您的代码进行一些更改:
注解用于理解 class 我们要测试的内容,并准备 class 模拟静态、final 等方法(因此通常不能模拟的方法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)
到 class,您将能够模拟或监视 WidgetUploadClient class,因此您必须将两个(或者如果您想要更多)参数传递给 class使用数组作为注释的参数,只需编写 this
@PrepareForTest({WidgetUploadClient.class, WidgetMarshaller.class})
希望你能成功:D
再见
我相信我使用的 API 是正确的,但我遇到了一个错误,该错误影响尝试使用 Robolectric 和 PowerMock 的组合的开发人员。作为参考,可以在 Robolectric 的 issue tracker 上跟踪错误。至少从 2016 年 1 月开始(目前大约 6 个月前),图书馆的组合就被打破了。
我正在尝试使用 PowerMockito 创建一个 final
class 的间谍,但我不断收到以下错误,即使我正在使用 PowerMockito 的 spy()
方法Mockito 的:
java.lang.IllegalArgumentException: Cannot subclass final class class 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 中的替代方法:使用 RobolectricTestRunner
或 RobolectricGradleTestRunner
作为测试 运行ner (@RunWith
) 和 @Rule public PowerMockRule rule = new PowerMockRule()
。当我这样做时,测试完全失败 运行 并抛出一个不同的异常。
我正在使用 PowerMock/PowerMockito 1.6.5、Robolectric 3.1 和 Java 1.8.0_91-b14.
要实现此功能,您必须了解注释 @PrepareForTest 的作用并对您的代码进行一些更改:
注解用于理解 class 我们要测试的内容,并准备 class 模拟静态、final 等方法(因此通常不能模拟的方法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)
到 class,您将能够模拟或监视 WidgetUploadClient class,因此您必须将两个(或者如果您想要更多)参数传递给 class使用数组作为注释的参数,只需编写 this
@PrepareForTest({WidgetUploadClient.class, WidgetMarshaller.class})
希望你能成功:D 再见
我相信我使用的 API 是正确的,但我遇到了一个错误,该错误影响尝试使用 Robolectric 和 PowerMock 的组合的开发人员。作为参考,可以在 Robolectric 的 issue tracker 上跟踪错误。至少从 2016 年 1 月开始(目前大约 6 个月前),图书馆的组合就被打破了。