[英]How can I use mockito to Mock a class method that is inside another class
我正在嘗試使用JUnit和Mockito模擬端到端方法(addSomething方法)。 顯然,在該方法內部我使用了其他方法。 我的懷疑是:
我想要的一個簡單示例是:
方法A
public int summing(int sum){
int A = 5;
int B = 23;
sum = SumOfIntegers(A,B);
return sum;
}
方法B
private int SumOfIntegers(int number1, int number2){
try{
result = number1 + number2;
}catch (Exception e) {
e.printStackTrace();
}
return result;
}
我如何模擬類的方法A,因為它正在調用私有方法?
單元測試驗證單元的公共可觀察到的行為 ,即返回值及其與依賴項的通信
您遇到的問題是ServerProxy
存在隱藏的依賴關系。 您不應該在該方法中實例化它,而不是在該類中實例化它。
如果嚴格遵循關注點/單一責任模式的分離,則依賴關系的實例化是其自身的責任,不應由使用依賴關系的對象來完成。
總之,您應該通過依賴項 注入將ServerProxy
對象注入被測單元中,最好作為構造函數參數,最有可能使用DI框架 。 在這種情況下,將ServerProxy
替換為可以為測試配置的模擬很簡單。
您需要模擬addSomething()
所屬的類。
假設您有一個使用該方法的類。
public class ClassB {
public String methodB(String jsonSomething) {
...
String result = addSomething("{}");
...
}
}
public class ClassA {
public String addSomething(String jsonSomething) {
...
}
}
在ClassB的測試類中,您將模擬classA對象,並為addSomething
方法指定行為。 您無需為addSomething
內部的addSomething
指定任何addSomething
行為。
@RunWith(MockitoJRunner.class)
public class ClassBTest {
@Mock
private ClassA classA;
@Test
testMethodB() {
given(classA.addSomething(anyString())).willReturn("{}"); // Here you are specifying the mocked behavior for addSomething
...
}
}
如果您打算模擬對象范圍內的對象方法,則可以使用PowerMock之類的方法來實現,但這實際上通常表明您的代碼編寫得不好,無法輕松測試。
我建議您對代碼進行重構,以確保使用依賴注入將具有要模擬方法的任何對象都包含在類級別。 然后,通過在測試中使用@Mock批注標記這些對象並使用@InjectMocks標記要測試的類,從而通過嘲笑模擬起來非常簡單。 然后,這將確保將對象的模擬物注入到測試中的測試中的類中,而不是對象的真實實例中,然后可以對所需的所有方法進行存根。
您不模擬方法,而是模擬整個類,並在調用它們的方法時使它們響應所需的方式。 然后,如果您在類內部使用方法A,而此方法A使用方法B,則僅模擬方法A。不會執行該類中的代碼,因此您無需模擬整個鏈。 這就是嘲笑的重點。 那是你的要求嗎?
因此,您永遠不會模擬在Main方法中使用的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.