Mockito存根方法为所有类的实例返回值

时间:2014-03-01 04:42:01

标签: java unit-testing mockito

情景:

我正在使用独立设置测试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上。

感谢您回答我的问题。

2 个答案:

答案 0 :(得分:1)

将您的setId()方法设为公开,然后添加account.setId(whatever)setId()方法没有真正的私人理由。仅仅因为Hibernate可以设置私有字段并不意味着你不应该为它设置一个公共setter,特别是如果你的测试需要它。如果你真的想把它保密,那么就像Hibernate一样做,并用反射设置它。但我不会这样做。

答案 1 :(得分:0)

我已将此测试移至集成测试,因为我有完整的spring容器以及内存数据库来通过hibernate设置id。

VAM