情景:
我正在使用独立设置测试Spring MVC控制器。
控制器从请求中的JSON对象获取参数。在将JSON对象转换为java对象后调用服务。服务使用JPA将其保存到DB,然后更新实体的Id字段并返回控制器。在将实体转换为JSON后,控制器将JSON响应返回给调用者。
我在我的测试类中模拟了服务并使用@InjectMocks注入控制器
模拟服务无法访问JPA实体的私有setId方法,因为它在真实场景中由hibernate填充。
现在,当我模拟服务时,如何存根创建实体的getId方法?
测试mockservice的代码:
@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上。
感谢您回答我的问题。
答案 0 :(得分:1)
将您的setId()
方法设为公开,然后添加account.setId(whatever)
。 setId()
方法没有真正的私人理由。仅仅因为Hibernate可以设置私有字段并不意味着你不应该为它设置一个公共setter,特别是如果你的测试需要它。如果你真的想把它保密,那么就像Hibernate一样做,并用反射设置它。但我不会这样做。
答案 1 :(得分:0)
我已将此测试移至集成测试,因为我有完整的spring容器以及内存数据库来通过hibernate设置id。
VAM