簡體   English   中英

@MockBean 和 @Autowired 在一項測試中使用相同的服務 class

[英]@MockBean and @Autowired of the same service in one test class

是否有可能以某種方式在同一服務的同一測試 class @MockBean@Autowired中進行?

換句話說,我只想為一個測試提供@MockBean服務,而對於相同 class 的其他測試,我需要它作為@Autowired

這取決於@MockBean@Autowired之間的區別。

@Autowired

僅在SpringContext中查找該類型的 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注釋的 class 中創建 bean

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

   @Autowired
   MyService myService;

   @TestConfiguration
   static class Config {

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

或者,在使用@Configuration注釋的 class 中

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

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

我懷疑這里的邪惡來源是場注入。

Olvier Gierke(現為 Drotbohm)寫了一篇關於為什么場注入是邪惡的博客文章。

如果您可以切換到構造函數注入,則可以僅在測試中模擬服務並將模擬傳遞給您要測試的 class。

我只是想把這個答案留在這里,作為對其他可能有機會使用構造函數注入的人的建議。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM