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 类的对象定义了该函数。