Java Mockito存根一个方法以返回类的所有实例的值

Java Mockito存根一个方法以返回类的所有实例的值,java,unit-testing,mockito,Java,Unit Testing,Mockito,情景: 我正在使用独立设置测试SpringMVC控制器 控制器从请求中的JSON对象获取参数。它在将JSON对象转换为java对象后调用服务。该服务使用JPA将其保存到DB,然后更新实体的Id字段并返回控制器。控制器在将实体转换为JSON后将JSON响应返回给调用方 我在测试类中模拟了服务,并使用@InjectMocks将其注入控制器 模拟服务无法访问JPA实体的私有setId方法,因为在真实场景中它是由hibernate填充的 现在,当我模拟服务时,如何存根所创建实体的getId方法 测试mo

情景:

我正在使用独立设置测试SpringMVC控制器

控制器从请求中的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));
在上述的doAnswer方法中,它是无效的

对于任何实例的Account.class的getId方法的所有调用,是否有任何方法可以返回像22这样的常量值

给出一个部分 实例、类级别和静态方法
这正好满足了我的需要,他们为所有实例存根一个实例方法 但它是在python上实现的


谢谢你回答我的问题。

公开你的
setId()
方法,并添加
account.setId(无论什么)
setId()。Hibernate可以设置私有字段并不意味着不应该为其设置公共setter,特别是在测试需要它的情况下。如果您真的想保持它的私有性,那么可以执行与Hibernate相同的操作,并使用反射设置它。但是我不会那样做。

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


Vam

是的,我们可以这样做,并完成测试和功能。但我更感兴趣的是,我们如何做类似于我们在针对python的mockito中所做的事情。在类级别对的方法进行存根,使其适用于所创建类的所有实例。谢谢
Account spier = spy(account);
doReturn(new Long(22)).when(spier).getId();
spier.setFirstName("cba123");