Mockito Matchers不工作

时间:2016-11-01 22:58:30

标签: unit-testing mockito

我在代码的不同位置有这两行:

Message<T1> reply = (Message<T1>) template.sendAndReceive(channel1, message);

Message<T2> reply = (Message<T2>) template.sendAndReceive(channel2, message);

我正在进行一些单元测试,测试涵盖两个语句。当我试图模仿行为时,我定义了一些这样的行为:

Mockito.when(template.sendAndReceive(Mockito.any(MessageChannel.class), Matchers.<GenericMessage<T1>>any() )).thenReturn(instance1);

Mockito.when(template.sendAndReceive(Mockito.any(MessageChannel.class), Matchers.<GenericMessage<T2>>any()   )).thenReturn(null);

当我执行单元测试并进行一些调试时,第一个语句返回null

你知道匹配器看起来不起作用吗?它始终采用模拟的最后定义。我正在使用Mockito 1.1.10

1 个答案:

答案 0 :(得分:2)

  

当我执行单元测试并进行一些调试时,第一个   语句返回null

之所以发生这种情况,是因为你使用thenReturn(..);对同一个方法调用进行了两次存根,最后一次使用null获胜。

实现目标的正确方法是提供调用方法时要返回的连续返回值的列表:

Mockito.when(template.sendAndReceive(Matchers.any(MessageChannel.class), Matchers.any(GenericMessage.class)))
    .thenReturn(instance1, null);

在这种情况下,第一次调用的返回值为instance1,所有后续调用都将返回null。查看示例here

Ashley Frieze建议的另一个选择是让template.sendAndReceive根据参数返回不同的值:

Mockito.when(template.sendAndReceive(Matchers.same(channel1), Matchers.any(GenericMessage.class)))
    .thenReturn(instance1);
Mockito.when(template.sendAndReceive(Matchers.same(channel2), Matchers.any(GenericMessage.class)))
    .thenReturn(null);

甚至更短,我们可以省略第二行,因为未设置的模拟方法调用的默认返回值为null

Mockito.when(template.sendAndReceive(Matchers.same(channel1), Matchers.any(GenericMessage.class)))
    .thenReturn(instance1);

这里我们假设某些channel1channel2在测试类的范围内并被注入到测试对象中(至少从问题中提供的代码片段看来是这样)。 / p>