gpt4 book ai didi

java - Mockito stub 方法以返回类的所有实例的值

转载 作者:行者123 更新时间:2023-11-30 11:21:43 28 4
gpt4 key购买 nike

场景:

我正在使用独立设置测试 Spring MVC Controller 。

controller从request中的json对象中获取参数,将json对象转为java对象后调用service,service使用JPA保存到DB中,然后更新entity的Id字段返回给controller . Controller 将实体转换为JSON后返回JSON响应给调用者。

我已经在我的测试类中模拟了服务并使用@InjectMocks 注入(inject)到 Controller

模拟服务无法访问 JPA 实体的私有(private) setId 方法,因为它在真实场景中由 hibernate 填充。

现在,当我模拟服务时,如何 stub 创建实体的 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));

现在如何 stub Account 类的 getId 方法,以便 Controller 在 JSON 响应中提供 Id。

我无法创建模拟帐户对象,因为它是由 Controller 从 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给出一个部分实例、类级别和静态方法
这完全符合我的需要,他们为所有实例 stub 实例方法但它是在 python 上。

感谢您回答我的问题。

最佳答案

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

关于java - Mockito stub 方法以返回类的所有实例的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22110221/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com