簡體   English   中英

如何調用模擬 class 的方法的方法?

[英]How to call a method of a method of a mocked class?

如何調用模擬 class 的方法的方法?

when(mockedClass.method1().method2()).thenReturn(x);

這行代碼正在拋出

org.mockito.exceptions.misusing.MissingMethodInvocationException

在 mocking class 之后,我無法調用第二種方法。 我試過doReturn ,間諜但沒有用。

任何解決方案表示贊賞!

method2()不屬於您模擬的類型。 它屬於method1()返回的類型。 您只能告訴模擬在調用method1()時要返回什么(這就是在異常 package 名稱中misusing部分的原因)。

理論上,您可以為method1()返回的類型創建一個模擬,並指示mockedClass返回第二個模擬,然后在調用method2()時告訴新模擬返回x 但是,出於多種原因,讓模擬返回其他模擬通常是一個非常糟糕的主意。

在不了解您的實際代碼以及您真正想要實現的目標的情況下,很難就此提供任何建議。 因此,我只能提供一些一般性提示,這些提示可能適用於您的情況,也可能不適用於您的情況。

通常,應該避免object1.method1().method2()調用鏈。 “告訴,不要問”原則說,應避免向 object 詢問,然后對其進行操作(告訴object 該做什么,而不是向它詢問並自己做)。 調用鏈意味着method1()正在返回另一個 object ( object2 ),然后用於調用method2() 取而代之的是,您應該向object1添加一個方法,該方法正在調用method2()並返回其結果。 簡單的例子:

這就是你的類可能的樣子

public class C1 {
    private C2 o2;

    public C2 method1() {
        return o2;
    }
}

public class C2 {
    public int method2() {
        return computeValue();
    }
}

// somewhere else:
int value = object1.method1().method2();

相反,您可以像這樣設計它:

public class C1 {
    private C2 o2;

    //public C2 method1() {
    //    return o2;
    //}
    public int method3() {
        return o2.method2();
    }
}

public class C2 {
    public int method2() {
        return computeValue();
    }
}

// somewhere else:
//int value = object1.method1().method2();
int value = object1.method3();

這樣您就可以避免調用鏈,並且C1不必透露它包含C2類型的值,這意味着您可以在調用者不知道的情況下更改它。

除了更好的設計和避免調用鏈(也稱為“火車殘骸”)之外,這還允許您針對 mocking 情況執行以下操作:

//when(mockedClass.method1().method2()).thenReturn(x);
when(mockedClass.method3()).thenReturn(x);

暫無
暫無

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

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