![](/img/trans.png)
[英]Verify a void method was called inside a private method with EasyMock/PowerMock
[英]PowerMock + EasyMock: private void method without invokation
美好時光!
我需要用模擬實現替換類的私有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!");
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.