4.1 方法參數
添加到模擬對象的先前規則處理沒有參數的方法。以及如何為帶參數的方法創建規則?此外,我想創建規則,以便對於某些參數值有一個結果,而對於其他參數值則有另一個結果。
你也可以這樣做。如果您希望該方法返回帶有特定參數的特定內容,那麼規則可以這樣寫:
Mockito.doReturn(result).when(an object).method name(parameter);
讓我們看一個例子來更好地理解。讓我們的 List 在請求第 10 個元素時返回名字 Ivan,在請求第 500 個元素時返回名字 Marya。說到做到。
@ExtendWith(MockitoExtension.class)
class ParamsTest {
@Mock
List mockList;
@Test
public void whenMockAnnotation() {
//adding the first rule
Mockito.doReturn("Ivan").when(mockList).get(10);
//adding a second rule
Mockito.doReturn("Maria").when(mockList).get(500);
assertEquals("Ivan", mockList.get(10));
assertEquals("Maria", mockList.get(500));
}
}
4.2 參數模板
狡猾的同事馬上會問我這個問題:“如果方法需要參數,但對於任何值它都必須返回相同的結果怎麼辦?”。我們不要寫:
Mockito.doReturn("Ivan").when(mockList).get(1);
Mockito.doReturn("Ivan").when(mockList).get(2);
Mockito.doReturn("Ivan").when(mockList).get(99);
不,沒有人強迫你那樣寫。如果您想將規則添加到適用於具有任何參數的方法的模擬對象,那麼有一個特殊的對象:
Mockito.any()
我們的示例將這樣寫:
Mockito.doReturn("Ivan").when(mockList).get(any(int.class));
這裡有一些細微差別。該對象Mockito.any()
具有類型Object
,因此有不同類型參數的類似物:
方法 | 參數類型 | |
---|---|---|
1個 | 任何() | 包含 null 的對象 |
2個 | 任何(類名.類) | 班級名稱 |
3個 | 任何整數() | 整數 |
4個 | 任何布爾值() | 布爾值 |
5個 | 任何雙() | 雙倍的 |
6個 | 任何列表() | 列表 |
更準確地說,我們的例子應該是這樣的:
Mockito.doReturn("Ivan").when(mockList).get(anyInt());
4.3 doAnswer()方法
我們了解了虛擬方法的複雜行為。遲早會出現您希望此虛擬方法具有復雜行為的情況。例如,它應該根據參數返回值,將字符串轉換為大寫。
這個 - 有一個特殊的方法doAnswer()
,它傳遞一個函數來做你需要的:
Mockito.doAnswer(function).when(an object).method name(parameter);
讓我們讓get()
類方法List
返回傳遞給它的參數的平方。並編寫如下程序:
@ExtendWith(MockitoExtension.class)
class DoAnswerTest {
@Mock
List mockList;
@Test
public void whenMockAnnotation() {
Mockito.doAnswer(invocation -> {
int parameter = invocation.getArgument(0);
return parameter * parameter;
}).when(mockList).get(anyInt());
assertEquals(100, mockList.get(10));
assertEquals(25, mockList.get(5));
}
}
我們使用 Answer 類的對象定義了該函數。