我在代码的不同位置有这两行:
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
答案 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);
这里我们假设某些channel1
和channel2
在测试类的范围内并被注入到测试对象中(至少从问题中提供的代码片段看来是这样)。 / p>