EasyMock expect方法在同一测试中返回多个不同的对象
问题描述:
我正在使用EasyMock来单元测试我的Java代码。我试图测试的类是一个RESTful web服务API层。 API有一个底层服务层,它正在API测试中被模拟。我的问题是搞清楚如何正确地单元测试我的editObject(ID, params...)
API方法,因为它调用service.getById()
两次,并期望每次调用都返回一个不同的对象。EasyMock expect方法在同一测试中返回多个不同的对象
editObject(ID, params...)
首先尝试从服务层获取对象以确保ID有效(首次调用service.getById(ID)
,返回原始未修改的对象)。接下来,它修改API调用中指定的参数,将其保存到服务中,并再次调用以将调用者交给服务管理的修改对象(第二个调用对象为service.getbyId(ID)
,返回修改后的对象)。
有没有一种方法可以用EasyMock来表示?
答
当然,您可以使用相同的方法和参数对两个方法调用执行两个不同的操作。只需按照您期望它们发生的顺序声明您的期望并相应地设置响应。
expect(mockService.getById(7)).andReturn(originalObject).once();
expect(mockService.getById(7)).andReturn(modifiedObject).once();
replay(mockService);
.once()
是可选的,但我发现在这种情况下,它更自我记录。
答
这种技术在条件表达式中也很有用,在这种表达式中,您可能想要使第一个条件失效,但通过第二个条件或者反之亦然。
答
你可以将多个andReturn
方法调用:
EasyMock.expect(service.getById(1))
.andReturn(firstObject)
.andReturn(secondObject);
首次service.getById
被称为与1
作为参数,模拟将返回firstObject
和第二次secondObject
。您可以根据需要链接任意数量,甚至通过andThrow
为特定呼叫抛出异常。