![](/img/trans.png)
[英]Spring Boot Test : Mix up @MockBean and @SpyBean in same Test class on same Bean object?
[英]@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.