簡體   English   中英

Spring Boot:如何將原型作用域bean的相同實例注入Spring Boot Test?

[英]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.

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