Mockito和JpaRepository的问题

时间:2018-03-13 16:52:41

标签: spring spring-boot mockito spring-data-jpa

我有一个Spring启动项目,我正在迁移到Spring boot 2。 我的一些测试表明,使用旧版本时,使用旧版本的测试失败了。

这个问题很容易重现。

我创建了2个Controller。在第一个,我注入一个服务。在第二个中,我注入了一个JpaRepository。

现在我为这个Controller创建了UnitTests。 对于第二个Controller,我模拟了Repository。一切正常。 对于第一个控制器,我模拟了服务。测试失败。 它似乎搜索注入存储库,而它没有在此控制器中使用。

我创建了一个非常简单的项目来重现这种行为: https://github.com/YLombardi/mockito-spring-jpa-issue

我的测试是错误还是错误?

1 个答案:

答案 0 :(得分:1)

我能够从您提供的repo url重现该问题。如果您在运行ControllerAUnitTests时发现异常,则说明

...UnsatisfiedDependencyException: Error creating bean with name 'controllerB'...

现在,当你运行controllerB的测试时,为什么spring会尝试加载ControllerA bean?

这是因为您使用的是SpringRunner和默认mockMvc。它加载整个spring上下文,这意味着它将创建包含controllerB的每个组件的bean。

要创建controllerB的bean,您需要拥有JpaRepo的实例。所以,就像你在ServiceA中创建了ControllerAUnitTests的模拟bean一样,你也需要为JpaRepo创建模拟bean。

    @MockBean
    private ServiceA serviceA;

    // NOTE THIS BLOCK
    @MockBean
    private JpaRepo jpaRepo;

    @Test
    public void test() throws Exception {
        doReturn("a").when(serviceA).getAString();
        mockMvc.perform(get("/a"))
                .andDo(print())
                .andExpect(status().isOk())
                // Test now runs but assert fails below, that you need to fix.
                .andExpect(view().name("aview"))
                .andExpect(content().string("a"));
    }