[英]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) 沒有出現。
null
與any(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.