[英]How to mock a non-static private inner java class with PowerMock and EasyMock?
[英]Private static inner class - Powermock
我想使用Powermock(基於EasyMock)模擬私有靜態內部類。 這不是來自生產代碼,這只是一個問題是否可行。 我很確定這是一個不好的設計,但這是我為科學所做的嘗試。
假設我們有一個帶有靜態私有內部類的類:
public class Final {
private static class Inner {
private final int method () { return 5; }
}
public int callInnerClassMethod () {
return new Inner().method();
}
}
我想模擬Inner
類及其method
。
我得出的代碼如下:
Class<?> innerType = Whitebox.getInnerClassType(Final.class, "Inner");
Object innerTypeMock = PowerMock.createMock(innerType);
PowerMock.expectNew(innerType).andReturn(innerType);
PowerMock.expectPrivate(innerType, "method").andReturn(42);
PowerMock.replay(innerTypeMock);
new Final().callInnerClassMethod();
在代碼中:我們獲得Inner.class
的類型並對其進行模擬,當用戶創建Inner
類型的新對象時,我們說我們返回實例,而當有人調用其method
我們為其提供實現。
通常,我正在學習有關模擬的知識,可以肯定的是,這段代碼證明了我不知道自己在做什么。 該代碼甚至無法編譯,並且在PowerMock.expectNew(innerType).andReturn(innerType)
行上出現以下錯誤:
IExpectationSetters中的andReturn(捕獲)不能應用於(java.lang.Object)
甚至可以嘲笑私有靜態內部類嗎? 我還沒有找到關於SO的權威代碼示例。
我設法通過在代碼中使用裸Class innerType = ...
而不是Class<?> innerType = ...
來解決編譯錯誤。 感覺不對,但是行得通。 如果有人在原始示例中解釋了差異以及如何使差異生效,我將不勝感激。 在某些地方,我混合了innerType
和innerTypeMock
。 完整的有效測試代碼如下所示:
Class innerType = Whitebox.getInnerClassType(Final.class, "Inner");
Object innerTypeMock = PowerMock.createMock(innerType);
PowerMock.expectNew(innerType).andReturn(innerTypeMock);
PowerMock.expectPrivate(innerTypeMock, "method").andReturn(42);
PowerMock.replayAll();
System.out.println(""+new Final().callInnerClassMethod());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.