簡體   English   中英

私有靜態內部類-Powermock

[英]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 = ...來解決編譯錯誤。 感覺不對,但是行得通。 如果有人在原始示例中解釋了差異以及如何使差異生效,我將不勝感激。 在某些地方,我混合了innerTypeinnerTypeMock 完整的有效測試代碼如下所示:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM