mockito 同一个测试类中同一个服务的@MockBean和@Autowired

tvz2xvvm  于 2022-11-08  发布在  其他
关注(0)|答案(3)|浏览(403)

是否可能在同一个测试类中拥有同一个服务的@MockBean@Autowired
换句话说,我希望只为一个测试提供@MockBean服务,而对于同一类的其他测试,我需要它作为@Autowired

uubf1zoe

uubf1zoe1#

这取决于@MockBean@Autowired之间的差异。

@Autowired

只在SpringContext中查找该类型的bean。这意味着如果需要“自动连接”bean,则需要创建该bean

@MockBean(四个月)

完全按照您对名称的期望,它创建服务的“模拟”,并将其作为bean注入。
所以这

class MyTest {
   @MockBean
   MyService myService;
}

相当于

@Import(MyTest.Config.class)
class MyTest {

   @Autowired
   MyService myService;

   @TestConfiguration
   static class Config {

      @Bean
      MyService myService() {
         return Mockito.mock(MyService.class);
      }
   }
}

因此,如果您需要在其他测试中使用MyService类型的不同bean,则需要在@TestConfiguration注解类中创建bean

@Import(MyTest.Config.class)
class MyTest {

   @Autowired
   MyService myService;

   @TestConfiguration
   static class Config {

      @Bean
      MyService myService() {
         return new MyServiceImpl();
      }
   }
}

或者,在用@Configuration标注的类中

@Import(MyConfig.class)
class MyTest {
   @Autowired
   MyService myService;
}

@Configuration
public class MyConfig {
   @Bean
   MyService myService() {
      return new MyServiceImpl();
   }
}
dced5bon

dced5bon2#

最好的解决方案是将@MockBean更改为@SpyBean。在该方法中,您将能够执行以下操作:
Kotlin

@SpyBean
    lateinit var serviceMock: Service

    @Test
    fun smallTest()
        `when`(serviceMock.doSomething())
            .thenReturn(false)

        // your test logic
    }
eaf3rand

eaf3rand3#

我怀疑这里邪恶的源头是力场注入。
Olvier Gierke(现在的Drotbohm)写了一篇关于为什么场注入是邪恶的blog post
如果可以切换到构造函数注入,则可以在测试中模拟服务,并将模拟传递给要测试的类。
我只是想把这个答案留在这里,作为对其他可能有机会使用构造函数注入的人的建议。

相关问题