簡體   English   中英

使用JMockit在抽象類中模擬非公共靜態方法?

[英]Mocking non-public static methods in abstract classes with JMockit?

我有以下課程:

public abstract class AbstractParent {
    static String method() {
        return "OriginalOutput";
    }
}

我想嘲笑這個方法。 我決定使用JMockit 所以我創建了一個模擬類:

public class MockParent {
    static String method() {
        return "MOCK";
    }
}

我的測試代碼如下所示:

public class RealParentTest {

    @Before
    public void setUp() throws Exception {
        Mockit.redefineMethods( AbstractParent.class, MockParent.class );
    }


    @Test
    public void testMethod() {
        assertEquals(MockParent.method(),AbstractParent.method());
    }

}

不幸的是,這個測試表明AbstractParent返回“OriginalOutput”而不是“MOCK”。 有什么想法嗎? 難道我做錯了什么? 我已經嘗試將我的模擬類聲明為抽象,但無濟於事。

編輯注意,使方法公開會導致測試運行沒有問題...這很奇怪,因為使用JMockit,您應該能夠模擬任何范圍的方法。

回答只有mock方法需要公開,你可以保留原來的方法。

找到解決方案:你只需要將mock的方法設為public(原始方法可以保持其原始可見性)。

我不知道為什么這種方法有效,而原始方式卻沒有(有人歡迎加入),但你需要做的只是將上面例子中的mock類更改為:

public class MockParent {
    public static String method() {
        return "MOCK";
    }
}

顯然,執行此操作的新方法是使用MockUp<T>

new MockUp<AbstractParent>(){
    @Mock String method() {
        return "MOCK";
    }
};

assertEquals("MOCK" AbstractParent.method());

另一種選擇顯然是繼續使用MockParent@MockClass annonation這樣的東西。 自己沒有這樣做,因為另一個內聯版本完成了這項工作。

在github上的一個示例項目中實現了這個。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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