[@ MockBean和@Autowired在一个测试类中使用同一服务

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[@ MockBean和@Autowired在一个测试类中使用同一服务相关的知识,希望对你有一定的参考价值。

是否可能以某种方式在同一服务的相同测试类@MockBean@Autowired中使用?

换句话说,我只想为一个测试提供@MockBean服务,而对于同一类别的其他测试,我需要将其作为@Autowired

答案

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

@Autowired

仅在SpringContext中查找该类型的bean。这意味着如果需要“自动装配”它,则需要创建该bean

@MockBean

完全符合您的期望,它将创建服务的“模拟”,并将其作为bean注入。

所以这个

class MyTest 
   @MockBean
   MyService myService;

等效于此

class MyTest 

   @Autowired
   MyService myService;

   @TestConfiguration
   static class Config 

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


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

class MyTest 

   @Autowired
   MyService myService;

   @TestConfiguration
   static class Config 

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

或者,如果您已经有一个包含该服务的bean的配置类,则只需@Import

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


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

以上是关于[@ MockBean和@Autowired在一个测试类中使用同一服务的主要内容,如果未能解决你的问题,请参考以下文章

spring单元测试Mock,MockBean踩坑及没有真实执行的理解

为啥弹簧测试失败,不起作用@MockBean

SpringBoot @MockBean 和 @WebMvcTest 不起作用

在应用程序启动之前配置@MockBean 组件

Spring Boot 测试中的 MockBean 注解导致 NoUniqueBeanDefinitionException

@MockBean 不适用于带有 JUnit 5 和 Spring Boot 2 的 @WebMvcTest?