[英]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.