第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

當(dāng)我有很多 SpringBootTest 類時(shí),如何有效地使用嵌套配置類來注入依賴項(xiàng)

當(dāng)我有很多 SpringBootTest 類時(shí),如何有效地使用嵌套配置類來注入依賴項(xiàng)

BIG陽 2024-01-05 15:02:55
這個(gè)問題是Can I use code to control the dependency resolution Decisions made by ApplicationContext in Spring Boot? 的續(xù)集。@SpringBootTest可接受的答案是在每個(gè)測(cè)試夾具類中定義一個(gè)嵌套類,對(duì)其進(jìn)行注釋@TestConfiguration并在其中為需要解析的每個(gè) bean 定義一個(gè)工廠方法。嵌套類的影響范圍僅限于測(cè)試裝置,影響裝置中的所有測(cè)試,但不影響其他裝置中定義的測(cè)試。當(dāng)在每個(gè)測(cè)試裝置中運(yùn)行測(cè)試時(shí),這提供了對(duì)注入組件的依賴項(xiàng)的細(xì)粒度控制。這種方法的問題是它需要在每個(gè)測(cè)試夾具類中添加一個(gè)嵌套的解析器類。這是不可擴(kuò)展的。考慮一個(gè)具有 10 個(gè)測(cè)試裝置的項(xiàng)目。其中 9 個(gè)使用相同的注入依賴項(xiàng),只有第 10 個(gè)僅需要一個(gè)特定接口的不同實(shí)現(xiàn)。在這種情況下,我需要將測(cè)試配置類復(fù)制到 9 個(gè)測(cè)試夾具類中,并僅在第 10 個(gè)測(cè)試中使用第二個(gè)配置類。我需要一種更具可擴(kuò)展性的方法來做到這一點(diǎn)。例如,在上面的情況下,我希望能夠定義兩個(gè)配置類,一個(gè)用于測(cè)試裝置使用的兩種配置中的每一種。然后我希望能夠?yàn)槊總€(gè)測(cè)試裝置指定應(yīng)使用兩個(gè)配置類中的哪一個(gè)。我努力了:我嘗試使用注釋將一個(gè)文本夾具的嵌套配置類導(dǎo)入到另一個(gè)測(cè)試夾具中@Import,但這樣做時(shí),后者中的配置類被忽略。我還嘗試將嵌套配置類移動(dòng)到上層,以便它可以用于未明確將不同配置類定義為嵌套類的所有測(cè)試裝置,但在這種情況下,所有測(cè)試裝置都會(huì)忽略配置類??傊艺趯ふ乙环N有效的方法,該方法允許我只編寫每個(gè)配置類一次,然后有選擇地將一個(gè)配置類應(yīng)用于每個(gè) SpringBootTest 類,而無需復(fù)制它。
查看完整描述

1 回答

?
PIPIONE

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超9個(gè)贊

經(jīng)過一些實(shí)驗(yàn),我得到了以下解決方案。

背景

  1. 我們有兩個(gè)接口:IClient 和 IServer

  2. IClient 有兩種實(shí)現(xiàn):RealClient 和 MockClient。

  3. IServer 有兩種實(shí)現(xiàn):RealServer 和 MockServer。

要求

  1. 生產(chǎn)代碼(在 main/java 中)應(yīng)該使用兩者的 Real 實(shí)現(xiàn)。

  2. 測(cè)試夾具(在test/java中用@SpringBootTest注釋)

  • InterfaceTests 定義了應(yīng)該使用 MockServer 和 MockClient 的測(cè)試

  • ClientTests 定義了應(yīng)該使用 MockServer 和 RealClient 來測(cè)試 RealClient 的測(cè)試。

  • ServerTests 定義了應(yīng)該使用 MockClient 和 RealServer 來測(cè)試 RealServer 的測(cè)試。

  • IntegrationTests 定義應(yīng)使用 RealServer 和 RealClient 的測(cè)試

從上面可以清楚地看出,模擬/真實(shí)客戶端/服務(wù)器有四種組合,并且每種組合在代碼的某些區(qū)域都需要。

解決方案

該解決方案利用 @Configuration 和 @TestConfiguration 注釋來實(shí)現(xiàn)這些要求,而無需重復(fù)代碼。

  1. 不要使用 @Component 注釋接口及其實(shí)現(xiàn)

  2. 在main/java下實(shí)現(xiàn)一個(gè)配置類如下:


@Configuration

public class RealInjector {

? ? @Bean

? ? public IServer createServer(){

? ? ? ? return new RealServer();

? ? }


? ? @Bean

? ? public IClient createClient(){

? ? ? ? return new RealClient();

? ? }

}


在test/java下實(shí)現(xiàn)這三個(gè)測(cè)試配置類

@TestConfiguration

public class AllMockInjector {

? ? @Bean

? ? public IServer createServer(){

? ? ? ? return new MockServer();

? ? }


? ? @Bean

? ? public IClient createClient(){

? ? ? ? return new MockClient();

? ? }

}


@TestConfiguration

public class MockServerInjector{

? ? @Bean

? ? public IServer createServer(){

? ? ? ? return new MockServer();

? ? }


? ? @Bean

? ? public IClient createClient(){

? ? ? ? return new RealClient();

? ? }

}


@TestConfiguration

public class MockClientInjector{

? ? @Bean

? ? public IServer createServer(){

? ? ? ? return new RealServer();

? ? }


? ? @Bean

? ? public IClient createClient(){

? ? ? ? return new MockClient();

? ? }

}


將 InterfaceTests 測(cè)試裝置注釋如下:

@RunWith(SpringRunner.class)

@SpringBootTest(classes = {AllMockInjector.class})

public class InterfaceTests { ... }

將 ClientTests 測(cè)試裝置注釋如下:

@RunWith(SpringRunner.class)

@SpringBootTest(classes = {MockServerInjector.class})

public class ClientTests { ... }

將 ServerTests 測(cè)試裝置注釋如下:

@RunWith(SpringRunner.class)

@SpringBootTest(classes = {MockClientInjector.class})

public class ServerTests { ... }

按如下方式注釋 IntegrationTests 測(cè)試裝置:

@RunWith(SpringRunner.class)

@SpringBootTest(classes = {RealInjector.class})

public class IntegrationTests { ... }

最后

為了讓測(cè)試配置類覆蓋 main/java 中的 RealInjector 配置類,我們需要設(shè)置屬性:


spring.main.allow-bean-definition-overriding=true?

一種方法是對(duì)上述每個(gè)測(cè)試裝置進(jìn)行注釋,如下所示:


@SpringBootTest(properties = ["spring.main.allow-bean-definition-overriding=true"])

class TestFixture { ... }

但這非常冗長,特別是如果您有很多測(cè)試裝置。相反,您可以在 test/resources 下的 application.properties 文件中添加以下內(nèi)容:


spring.main.allow-bean-definition-overriding=true

您可能還需要將其添加到 main/resources 下的 application.properties 中。


概括

該解決方案使您能夠?qū)ψ⑷氲缴a(chǎn)和測(cè)試代碼中的實(shí)現(xiàn)進(jìn)行細(xì)粒度控制。該解決方案不需要重復(fù)代碼或外部配置文件(除了 test/resources/application.properties 中的一個(gè)屬性)。


查看完整回答
反對(duì) 回復(fù) 2024-01-05
  • 1 回答
  • 0 關(guān)注
  • 165 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)