gpt4 book ai didi

java - Powermock 私有(private) stub 错误

转载 作者:太空宇宙 更新时间:2023-11-04 12:48:20 27 4
gpt4 key购买 nike

我正在尝试制作一个简单的示例,可以在官方 PowerMock 页面( here )上找到。我对此类进行了部分模拟:

public class Simple {


public String doMe() {
return privateMethod();
}

private String privateMethod() {
return "POWERMOCK sucks";

}

}

并编写了一个简单的测试类:

@RunWith(PowerMockRunner.class)
@PrepareForTest(Simple.class)
public class ProcessorTest {

@Test
public void doMe() throws Exception {
Simple spy = PowerMockito.spy(new Simple());
PowerMockito.doReturn("hello").when(spy, "privateMethod");
String res = spy.doMe();

PowerMockito.verifyPrivate(spy, Mockito.times(1000)).invoke(
"privateMethod");
Assert.assertEquals( res, "hello");
}


}

但是结果是这样的:

java.lang.AssertionError: expected [hello] but found [null]
Expected :hello
Actual :null
<Click to see difference>


at org.testng.Assert.fail(Assert.java:94)

因此,Powermock 不仅无法模拟 privateMethod 并返回“null”,即使它被调用了 1000 次也没关系。

如果我尝试像这样搞乱 mock ,它会变得更加令人毛骨悚然:

PowerMockito.doReturn(1).when(spy, "privateMethod");

所以我试图从 privateMethod 返回一个整数而不是字符串。然后我得到这个:

org.mockito.exceptions.misusing.WrongTypeOfReturnValue: 
Integer cannot be returned by doMe()
doMe() should return String
***

由于某种原因,Powermock 试图模拟公共(public) doMe 方法。

有人明白发生了什么吗?我不知道。

谢谢。

我的环境是:

Java 1.8、Mockito 1.10.19、Powermock 1.6.2

最佳答案

好吧,我找到了解决方案,问题是 JUnit 的 @RunWith 实际上并没有做到这一点,所以我必须从 PowerMockTestCase 进行扩展才能使其工作。测试现在看起来像这样,它的工作方式就像一个魅力:

@PrepareForTest(Simple.class)
public class ProcessorTest extends PowerMockTestCase {
@Test
public void doMe() throws Exception {
Simple spy = PowerMockito.spy(new Simple());
PowerMockito.doReturn("hello").when(spy, "privateMethod");

String res = spy.doMe();

PowerMockito.verifyPrivate(spy, Mockito.times(1)).invoke(
"privateMethod");
Assert.assertEquals( res, "hello");
}
}

关于java - Powermock 私有(private) stub 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36086167/

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