当前位置: 首页 > 知识库问答 >
问题:

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

江佐
2023-03-14

场景:

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

谢谢你回答我的问题。

共有2个答案

郭彬郁
2023-03-14

我已经将这个测试转移到集成测试中,因为我有完整的spring容器和一个内存数据库来设置hibernate的id。

Vam公司

祁奇略
2023-03-14

setId()方法设为公共方法,并添加account.setId(whatever)setId()方法没有真正的私有理由。仅仅因为Hibernate可以设置私有字段并不意味着您不应该为其设置公共设置程序,尤其是在测试需要的时候。如果您真的想保持它的私有性,那么请执行与Hibernate相同的操作,并使用反射设置它。但我不会那么做。

 类似资料:
  • 我正在开发基于spring的项目,并使用JUnit+Mockito编写单元测试用例。当将布尔值存根到同一个测试类的私有方法时,我面临一个问题(在将访问级别更改为public后,我仍然未能存根布尔值)。 下面的代码片段显示了同样问题的模拟 在这里,我想为method1()编写一个测试用例。在类ABC中,我有一个名为的方法,它通过查看一个全局会话池来帮助识别会话中的用户,该会话池保存所有登录的使用过的

  • 我有一个JPA实体和一个子实体列表。在这种情况下,是一个附加了角色的用户实体。 它看起来(有点简化-省略了一些字段/方法)如下: 如果是入侵,角色实体非常简单。 当我为每个用户添加两个用户和几百个角色时,当我列出用户时,我会得到一个疯狂的行为。每个用户都会被列出几百次(相同的用户=相同的唯一id)。 有问题的代码: 然而,当我只是访问数据库并执行select语句时,它看起来很好。每个用户只存在一次

  • 问题内容: 使用模拟编写单元测试时遇到问题。我需要模拟的对象有很多吸气剂,我确实在代码中称呼它们。但是,这些不是我的单元测试的目的。因此,有一种方法可以模拟所有方法,而不是一个个地模拟它们。 这是代码示例: 这是我需要测试的服务等级 在测试类中,测试方法就像 因此,有一种方法可以避免将所有无用的“ field1”的“ when”写入“ field20” 问题答案: 您可以控制模拟的默认答案。在创建

  • 我在用Mock编写单元测试时遇到了一个问题。有一个对象,我需要模拟有很多getter,我在代码中调用它们。但是,这些不是我的单元测试的目的。所以,有没有一种方法我可以模拟所有的方法,而不是一个一个地模拟它们。 下面是代码示例: 那么,有没有一种方法可以避免为无用的“field1”到“field20”写所有的“when”

  • 问题内容: 我在Mockito中有这个: 该方法应始终返回一个新实例,但它会返回两次相同的引用。 为什么该方法不返回新值? 问题答案: 该方法将始终返回传递给它的内容。该代码是在调用之前执行的。然后将创建的内容传递给。因此有一个绝对的实例而不是创建机制。 如果需要提供新实例,请使用thenAnswer

  • 问题内容: 在Java中,是否有任何可能的方法来获取某个类的所有实例? 问题答案: 实例化类(Singleton模式)时,可以使用Factory静态初始化程序,然后将工厂构造函数中的每个生成的实例添加到List中。 像这样的东西: