簡體   English   中英

Mockito 未返回預期的 object 時

[英]Mockito when not returning the expected object

我正在嘗試從模擬方法返回預期值。

TestClass testClass = TestClass.getInstance();
ClassToMock classToMock = Mockito.mock(ClassToMock.class);
testClass.setClassToMock(classToMock);
ExpectedObject expectedObject = new ExpectedObject("1", "2", "3");
when(classToMock.method(ArgumentMatchers.anyString(), ArgumentMatchers.anyBoolean(),
                        ArgumentMatchers.any(A.class), ArgumentMatchers.any(B.class))
                .thenReturn(expectedObject);
testClass.invokeTestMethod();

TestClass 和 invokeTestMethod 如下所示:

public class TestClass {

  private ClassToMock classToMock;

  public void invokeTestMethod() {
     ExpectedObject expectedObj1 = classToMock.method("A", "B", null, null);
     ::
     ::
     ExpectedObject expectedObj2 = classToMock.method("X", "Y", null, null);
     ::
     ::
     ExpectedObject expectedObj3 = classToMock.method("P", "Q", null, null);
     ::
     ::
  }

  public void setClassToMock(ClassToMock ctm) {
     this.classToMock = ctm;
  }
}

我已經在 TestClass 上設置了 classToMock 實例,以確保 TestClass 在模擬實例上工作。

為了使問題更清楚,方法調用發生在模擬的 object (classToMock) 上,但是預期的返回值 (ExpectedObject) 沒有出現。

此處的問題: nullany(X.class)不匹配,因此不會返回模擬值

如果null作為參數傳遞,那么最后兩個參數匹配器就位:

  • ArgumentMatchers.any(A.class)
  • ArgumentMatchers.any(B.class)

將不匹配

請參閱any(java.lang.Class)的文檔:

匹配任何給定類型的 object,不包括nulls 。 (標記為粗體以強調)

這是因為Mockito 2.1.0在內部嘗試評估參數的類型(類)。 null是一個空引用,不指向實例化的 object。 沒有參考 object,沒有 object 的 class 可以評估:

null instanceOf A // will evaluate to `false`
null instanceOf B // will evaluate to `false`

請參閱在調用 instanceof 之前是否需要檢查 null?

解決方法:使用any()isNull()匹配null

要在內部調用模擬方法,請使用參數匹配器,該匹配器將匹配傳遞的null值。

在第一個摘錄中,使用方法簽名(String,bool,A,B)作為參數調用方法,而在第二個摘錄中,使用簽名(String,String,Object,Object)調用方法。 所以在第二個摘錄中 classToMock.method("A", "B", null, null) 返回 null。

例如,您需要在 set 方法中的構造函數ClassToMock ro 傳遞給TestClass 這樣在測試中你可以通過你的模擬來測試 class 並且在方法invokeTestMethod中將使用模擬。 目前你沒有這樣做,所以在真正的 object 上調用method

感謝所有選擇提供幫助的人。 我找到了解決辦法。 在TestClass中有這樣一個調用: ExpectedObject expectedObj1 = classToMock.method("A", "B", null, null); 兩個 null 參數導致了該問題。 因此,我使用 NON NULL 參數重載了ClassToMock內的method 進行此更改后,模擬運行良好。

暫無
暫無

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

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