Mockito存根化一个方法,为类的所有实例返回值



场景:

我正在使用独立的设置测试一个SpringMVC控制器。

控制器从请求中的JSON对象获取参数。它在将JSON对象转换为java对象后调用服务。服务使用JPA将其保存到DB,然后更新实体的Id字段并返回到控制器。在将实体转换为JSON后,控制器将JSON响应返回给调用者。

我在测试类中模拟了该服务,并使用@InjectMocks 将其注入控制器

模拟服务无法访问JPA实体的私有setId方法,因为它在真实场景中是由hibernate填充的。

现在,当我模拟服务时,我如何存根创建的实体的getId方法?

测试模拟服务的代码:

@Test
public void thatAccountCreationRendersAsJson() throws Exception {
doAnswer(new Answer<Boolean>() {
@Override
public Boolean answer(InvocationOnMock invocationOnMock) throws Throwable {
Account account = (Account) invocationOnMock.getArguments()[0];
account.setEnabled(true);
account.setFirstName("bca123");
return Boolean.TRUE;
}   
}).when(mockAccountService).registerAccount(any(Account.class),
anyString(), any(BindingResult.class));

现在如何存根Account类的getId方法,以便控制器在JSON响应中给出Id。

我无法创建模拟帐户对象,因为它是由控制器从JSON创建并发送到模拟服务的。没有使用我的模拟帐户对象。

我试着用

Account spier = spy(account);
doReturn(new Long(22)).when(spier).getId();
spier.setFirstName("cba123");

在上述doAnswer方法中,但它无效。

有没有什么方法可以为任何实例的Account.class的getId方法的所有调用返回一个常量值,比如22?

http://code.google.com/p/mockito-python/wiki/Stubbing给出一个部分实例、类级别和静态方法
,这完全符合我的需求,它们为所有实例存根一个实例方法但它在python上。

谢谢你回答我的问题。

setId()方法公开,然后添加account.setId(whatever)setId()方法没有真正的理由是私有的。仅仅因为Hibernate可以设置私有字段并不意味着你不应该为它设置公共设置器,尤其是在测试需要的时候。如果你真的想保持它的私有性,那么就和Hibernate做同样的事情,并使用反射来设置它。但我不会那样做。

我已经将此测试转移到集成测试中,因为我有一个完整的spring容器和一个内存数据库来通过hibernate设置id。

Vam

相关内容

  • 没有找到相关文章

最新更新