【发布时间】:2014-04-02 08:15:35
【问题描述】:
场景:
我正在使用独立设置测试 Spring MVC 控制器。
控制器从请求中的 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 上。
感谢您回答我的问题。
【问题讨论】:
-
是的,我们可以做到这一点并完成测试和功能。但更感兴趣的是我们如何做一些类似于我们在 python 的 mockito 中所做的事情。在类级别存根方法,以便它适用于创建的类的所有实例。谢谢。
标签: java unit-testing mockito