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