场景:
我正在使用独立设置测试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");
但它并不有效。
有没有办法为帐户的getId方法的所有调用返回一个常量值,例如22.class对于任何实例?
http://code.google.com/p/mockito-python/wiki/Stubbing 给出了一个部分 实例,类级和静态方法
完全符合我的需求,他们为所有实例存根了一个实例方法,但它在python上。
谢谢你回答我的问题。
我已经将这个测试转移到集成测试中,因为我有完整的spring容器和一个内存数据库来设置hibernate的id。
Vam公司
将setId()
方法设为公共方法,并添加account.setId(whatever)
。setId()
方法没有真正的私有理由。仅仅因为Hibernate可以设置私有字段并不意味着您不应该为其设置公共设置程序,尤其是在测试需要的时候。如果您真的想保持它的私有性,那么请执行与Hibernate相同的操作,并使用反射设置它。但我不会那么做。
我正在开发基于spring的项目,并使用JUnit+Mockito编写单元测试用例。当将布尔值存根到同一个测试类的私有方法时,我面临一个问题(在将访问级别更改为public后,我仍然未能存根布尔值)。 下面的代码片段显示了同样问题的模拟 在这里,我想为method1()编写一个测试用例。在类ABC中,我有一个名为的方法,它通过查看一个全局会话池来帮助识别会话中的用户,该会话池保存所有登录的使用过的
问题内容: 使用模拟编写单元测试时遇到问题。我需要模拟的对象有很多吸气剂,我确实在代码中称呼它们。但是,这些不是我的单元测试的目的。因此,有一种方法可以模拟所有方法,而不是一个个地模拟它们。 这是代码示例: 这是我需要测试的服务等级 在测试类中,测试方法就像 因此,有一种方法可以避免将所有无用的“ field1”的“ when”写入“ field20” 问题答案: 您可以控制模拟的默认答案。在创建
我在用Mock编写单元测试时遇到了一个问题。有一个对象,我需要模拟有很多getter,我在代码中调用它们。但是,这些不是我的单元测试的目的。所以,有没有一种方法我可以模拟所有的方法,而不是一个一个地模拟它们。 下面是代码示例: 那么,有没有一种方法可以避免为无用的“field1”到“field20”写所有的“when”
我有一个JPA实体和一个子实体列表。在这种情况下,是一个附加了角色的用户实体。 它看起来(有点简化-省略了一些字段/方法)如下: 如果是入侵,角色实体非常简单。 当我为每个用户添加两个用户和几百个角色时,当我列出用户时,我会得到一个疯狂的行为。每个用户都会被列出几百次(相同的用户=相同的唯一id)。 有问题的代码: 然而,当我只是访问数据库并执行select语句时,它看起来很好。每个用户只存在一次
问题内容: 我在Mockito中有这个: 该方法应始终返回一个新实例,但它会返回两次相同的引用。 为什么该方法不返回新值? 问题答案: 该方法将始终返回传递给它的内容。该代码是在调用之前执行的。然后将创建的内容传递给。因此有一个绝对的实例而不是创建机制。 如果需要提供新实例,请使用thenAnswer
问题内容: 考虑以下代码: 编译器抱怨正在尝试对行为进行存根的行。关于如何使用存根方法返回带有有界通配符的类型的任何指针? 问题答案: 您也可以为此使用非类型安全方法doReturn, 正如在Mockito的Google组中讨论的那样。 尽管它比起来简单,但再次请注意,它不是类型安全的。如果您担心类型安全,那么米尔豪斯的答案是正确的。 额外细节 要明确的是,这是观察到的编译器错误, 我相信编译器已