[英]Prototype scope bean in controller returns the same instance - Spring Boot
[英]Spring Boot: How to inject the same instance of a prototype scoped bean into a Spring Boot Test?
我有一個服務類,該服務類使用通過以下方式聲明的原型范圍的bean:
@Bean
@Scope(scopeName = SCOPE_PROTOTYPE, proxyMode = TARGET_CLASS)
MyBean myBean() {...}
我有一個集成測試,如下所示:
@SpringBootTest
@ExtendWith(SpringExtension.class)
class MyServiceTest {
@Autowired
MyBean myBean;
// tests follow here
}
問題:我在測試中需要完全相同的MyBean
實例,但是Spring注入了一個不同的實例,因為Bean的范圍是“原型”。
問題:如何將原型作用域Bean的相同實例注入測試?
注意:我無法更改bean的作用域聲明。
您有兩種方法。
重寫MyBean
使其成為單例bean:
@TestConfiguration
public class OverrideBeanConfigurationForTest {
@Bean
@Scope(scopeName = SCOPE_SINGLETON)
MyBean myBean() {...}
}
或重寫它以返回始終相同的bean:
@TestConfiguration
public class OverrideBeanConfigurationForTest {
MyBean myBean;
@Bean
@Scope(scopeName = SCOPE_PROTOTYPE, proxyMode = TARGET_CLASS)
MyBean myBean() {
if (myBean == null){
myBean = new MyBean(...),
}
return myBean;
}
}
現在,在春季啟動測試中導入此配置,並指定屬性spring.main.allow-bean-definition-overriding=true
,因為默認情況下為false
:
@SpringBootTest({"spring.main.allow-bean-definition-overriding=true"})
@ExtendWith(SpringExtension.class)
@Import(OverrideBeanConfigurationForTest.class)
class MyServiceTest {
@Autowired
MyBean myBean;
// tests follow here
}
經過測試和工作。
如果您無法進行任何更改並且堅持直接注入Bean,那是不可能的。
該文檔明確指出:
每次對特定bean提出請求時,bean部署的非單一原型范圍都會導致創建一個新bean實例。 也就是說,該Bean被注入到另一個Bean中,或者您可以通過容器上的getBean()方法調用來請求它。 通常,應將原型作用域用於所有有狀態Bean,將單例作用域用於無狀態Bean。
您正在將其注入另一個bean。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.