gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 04:13:20 31 4
gpt4 key购买 nike

我正在尝试使用 PowerMockito 创建一个 final 类的 spy ,但我不断收到以下错误,即使我正在使用 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 中找到的替代方法: 使用 RobolectricTestRunnerRobolectricGradleTestRunner 作为测试运行器 (@RunWith) with @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再见

关于powermock - 无法使用 PowerMockito.spy() 模拟/监视最终类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38060683/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com