代码之家  ›  专栏  ›  技术社区  ›  YLombardi

Mockito和JpaRepository的问题

  •  0
  • YLombardi  · 技术社区  · 7 年前

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

    这个问题很容易重现。

    我创建了2个控制器。首先,我注入一个服务。在第二个例子中,我注入了一个JpaRepository。

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

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

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

    1 回复  |  直到 7 年前
        1
  •  1
  •   Yogesh Badke    7 年前

    我能够从您提供的回购url复制问题。如果在运行时注意到异常 ControllerAUnitTests ,它说

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

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

    这是因为您正在使用 SpringRunner 和默认值 mockMvc 。它加载整个spring上下文,这意味着它将创建每个组件的bean,包括 控制器B

    创建的bean 控制器B ,您需要有 JpaRepo 。就像你创造了 ServiceA 在里面 控制器单元测试 ,您需要为创建模拟bean JpaRepo公司

        @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"));
        }