簡體   English   中英

如何使用Mockito模擬另一個類中的類方法

[英]How can I use mockito to Mock a class method that is inside another class

我正在嘗試使用JUnit和Mockito模擬端到端方法(addSomething方法)。 顯然,在該方法內部我使用了其他方法。 我的懷疑是:

  • 要模擬端到端方法,我也需要模擬其他方法,對嗎?
  • 如何模擬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.

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