EasyMock期望方法在同一测试中返回多个不同的对象

时间:2011-08-03 01:06:34

标签: java unit-testing easymock

我正在使用EasyMock对我的Java代码进行单元测试。我正在尝试测试的类是RESTful webservice API层。 API有一个底层服务层,在API测试中被模拟。我的问题是弄清楚如何正确地对我的editObject(ID, params...) API方法进行单元测试,因为它会调用service.getById()两次并期望每次调用都返回一个不同的对象。

editObject(ID, params...)首先尝试从服务层获取对象以确保ID有效(首先service.getById(ID)调用expect,返回原始未修改对象)。接下来,它修改API调用中指定的参数,将其保存到服务,然后再次调用get将调用者交给服务管理的修改对象(第二个service.getbyId(ID)调用expect,返回修改后的对象)。

有没有办法用EasyMock表示这个?

3 个答案:

答案 0 :(得分:26)

当然,对于具有相同方法和参数的两个方法调用,您可以做两件不同的事情。只需按照您期望的顺序声明您的期望并相应地设置响应。

expect(mockService.getById(7)).andReturn(originalObject).once();
expect(mockService.getById(7)).andReturn(modifiedObject).once();
replay(mockService);

.once()是可选的,但在这种情况下,我发现它更具有自我记录功能。

答案 1 :(得分:6)

您可以链接多个andReturn方法调用:

EasyMock.expect(service.getById(1))
    .andReturn(firstObject)
    .andReturn(secondObject);

第一次使用service.getById作为参数调用1时,模拟将返回firstObject,第二次secondObject。您可以根据需要进行任意数量的链接,甚至可以通过andThrow针对特定呼叫发送异常。

答案 2 :(得分:0)

此技术在条件表达式中也很有用,在这种条件表达式中,您可能希望使第一个条件无效,但是传递第二个条件,反之亦然。