我遇到了一些看起来像这样的EasyMock 1遗留代码:
service.convertValue("value");
control.setDefaultReturnValue(new Integer(1));
//Run code that calls that method
升级到EasyMock 2时,我将其转换为以下内容(从this answer注明setDefaultReturnValue()
相当于andReturn().anyTimes()
):
expect(service.convertValue("value").andReturn(new Integer(1)).anyTimes());
//Run code that calls that method
但现在我收到了错误Unexpected method call convertValue("123")
很明显,在原始代码中,"value"
应该只是一个占位符。但除此之外,为什么这在EasyMock 1中有效,而在EasyMock 2中无效?
答案 0 :(得分:0)
埋在EasyMock 1.2 documentation中是一个解释这个问题的单一句子:
以下代码将MockObject配置为回答42到 voteForRemoval(“Document”)一次为-1,后续调用为,以及voteForRemoval()的所有其他参数:
mock.voteForRemoval("Document");
control.setReturnValue(42);
control.setDefaultReturnValue(-1);
(Empahsis mine)
换句话说,setDefaultReturnValue()
不仅在第一次之后为voteForRemoval("Document")
返回-1,而且如果传入任何其他参数也返回-1。它看起来像是编写测试的人你正看着知道这一点,并且认为他会扔掉一个占位符,而不是关心实际的参数。
EasyMock 2/3相当于您的代码:
expect(service.convertValue(isA(String.class))).andReturn(new Integer(1)).anyTimes();
EasyMock 2清除了很多这样的含糊之处,迫使开发人员明确定义他们想要的东西。考虑到旧式可能出现的意外副作用,它可能是最好的。