簡體   English   中英

如何調用模擬的模仿對象的實際構造函數?

[英]How can I call the actual constructor of a mocked mockito object?

我有類似的代碼

class superClass {
    public String transform(String str) {
        //lots of logic including ajax calls
        return("Modified"+str);
    }
}

class baseClass extends superClass {
    private FetchData fetchData;
    baseClass(FetchData fetchData) {   
        this.fetchData = fetchData;
    }

    public String parse() {
        String str = fetchData.get();
        //some more logic to modify str
        return transform(str);
    }
}

我正在使用Mockito和Junit進行測試。 我在嘲笑baseClass並做這樣的事情

baseClass baseMock = Mockito.mock(baseClass.class);
Mockito.when(baseMock.parse()).thenCallRealMethod();
Mockito.when(baseMock.transform()).thenReturn("Something");

我如何注入模擬fetchData ,因為它是通過構造函數注入的?

您可以使用Mockito.spyhttp://site.mockito.org/mockito/docs/current/org/mockito/Mockito.html#spy ):

baseClass object = new baseClass(new FetchData());
baseClass spy = Mockito.spy(object);

Mockito.when(spy.parse()).thenCallRealMethod();
Mockito.when(spy.transform()).thenReturn("Something");

您的問題具有不同的性質:您創建了難以測試的代碼。 構造函數就是這樣:構造函數必須非常小心。

另一件事是您直接“碰上”了“優先選擇繼承而不是繼承”。 簡單地擴展其他類以繼承一些有用的行為可能很誘人-但是當您這樣做時,您恰恰遇到了這類問題!

我的一個非答案:退后一步,仔細看看您的設計是否真的是最好的解決方案。 可能您是先看這些視頻才了解我在說什么。 如果您周圍有經驗豐富的人,請與他們交談; 並請他們審查您的設計。

暫無
暫無

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

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