玩得开心!
我需要用模拟实现代替类的私有void方法,但不知道如何做到这一点。我试着用这样的结构:
Test test = PowerMock.createPartialMock(Test.class, "setId");
PowerMock.expectPrivate(test , "setId", EasyMock.anyLong()).andAnswer(
new IAnswer<Void>() {
@Override
public Void answer() throws Throwable {
return null;
}
});
PowerMock.replay(test);
但是内部PowerMock的类名为WhiteBox调用我的"setId"方法,这是错误的我的任务。有人可以,请,建议,如何避免方法调用,并可能取代一个自定义的方法体?
终于。我有办法了。问题是我错过了以下注释:
@RunWith(PowerMockRunner.class)
@PrepareForTest(Test.class)
无论如何,要使PowerMock工作,我需要添加一些注释,这似乎相当令人困惑。如果这不是遗留代码,我更喜欢Mockito。
我不太确定我是否明白你的问题。但对我来说,下面的代码工作完美,只是字符串"Invoked!"
正在打印如果我删除test.setS(33L);
,测试将失败,例外:
@RunWith(PowerMockRunner.class)
@PrepareForTest(MainTest.Test2.class)
public class MainTest {
@Test
public void testName() throws Exception {
Test2 test = PowerMock.createPartialMock(Test2.class, "setS");
PowerMock.expectPrivate(test , "setS", EasyMock.anyLong()).andAnswer(
new IAnswer<Void>() {
@Override
public Void answer() throws Throwable {
System.out.println("Invoked!");
return null;
}
}).atLeastOnce();
PowerMock.replay(test);
test.setS(33L);
PowerMock.verify(test);
}
class Test2 {
long s;
private long getS() {
return s;
}
private void setS(long s) {
this.s = s;
System.out.println("Not this!");
}
}
}