【问题标题】:Mockito stubbing a method to return value for all instances of classMockito 存根方法以返回类的所有实例的值
【发布时间】: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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    Vam

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-12
      • 1970-01-01
      • 1970-01-01
      • 2020-02-21
      • 1970-01-01
      • 2011-09-06
      • 2015-05-23
      相关资源
      最近更新 更多