@MockBean и @Autowired одного сервиса в одном тестовом классе - PullRequest
1 голос
/ 21 апреля 2020

Можно ли как-то иметь в одном и том же классе испытаний @MockBean и @Autowired одного и того же сервиса?

Другими словами, я хотел бы иметь сервис @MockBean только для одного теста, в то время как для других тестов того же класса мне нужно это как @Autowired.

Ответы [ 2 ]

2 голосов
/ 21 апреля 2020

Это зависит от разницы между @MockBean и @Autowired.

@Autowired

выполняет поиск только в SpringContext для компонента этого типа. Это означает, что вам нужно будет создать этот bean-компонент, если вам нужно «autowire»:

@MockBean

делает именно то, что вы ожидаете от имени, он создает «макет» из сервис, и внедряет его как бин.

, поэтому этот

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 необходимо создать компонент в @TestConfiguration аннотированном классе

@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();
   }
}
0 голосов
/ 21 апреля 2020

Я подозреваю, что источником зла здесь является инъекция поля.

Ольвье Гирке (ныне Дротбом) написал сообщение в блоге о том, почему инъекция поля является злом.

Если вы можете переключиться на инъекцию в конструктор, вы можете смоделировать сервис только в своем тесте и передать макет классу, который вы хотите протестировать.

Я просто хочу оставить этот ответ здесь как совет для тех, кто может вместо этого есть возможность использовать инжектор конструктора.

...