美好时光!
我需要使用模拟实现替换类的private 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”方法,这对我的任务来说是错误的。请有人建议,如何避免方法调用,并可能用自定义方法替换方法体?
答案 0 :(得分:2)
最后。我有解决方案。 问题是我错过了以下注释:
@RunWith(PowerMockRunner.class)
@PrepareForTest(Test.class)
无论如何,要使PowerMock正常工作我需要添加一些注释似乎相当混乱。如果那不是遗留代码,我更喜欢Mockito。
答案 1 :(得分:0)
不太确定我是否得到了这个问题。
但对我来说,下面的代码工作得很完美,只是字符串"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!");
}
}
}