簡體   English   中英

如何使用 Spring Boot 測試條件創建 Bean?

[英]How to test conditional creation of a Bean with Spring Boot?

在模塊 AI 中有這個 class 層次結構:

public interface Sanitizer<C extends DocumentContext> {
    CommonWorkflowResult<C> sanitizeForInbound(C documentContext);
    CommonWorkflowResult<C> sanitizeForOutbound(C documentContext);
}

一個抽象基 class 實現了這個接口:

public abstract class BaseSanitizer<C extends DocumentContext> implements Sanitizer<C> { ... }

擴展基礎 class 的第一個子類:

@Component
public class SaxXmlSanitizer<C extends DocumentContext> extends BaseSanitizer<C> { ... }

第二個 class 擴展基礎 class:

@Component
public class RegExXmlSanitizer<C extends DocumentContext> extends BaseSanitizer<C> { ... }

在另一個模塊 BI 中,導入包含上述類的依賴項(模塊 A),這里我有一個配置,有條件地根據通過 application.properties 設置的屬性定義 bean:

@Bean
@ConditionalOnProperty(name = "sanitizer.type", havingValue = "REGEX", matchIfMissing = true)
public Sanitizer regExSanitizer() {
    return new RegExXmlSanitizer();
}

@Bean
@ConditionalOnProperty(name = "sanitizer.type", havingValue = "SAX", matchIfMissing = false)
public Sanitizer xmlSanitizer() {
    return new SaxXmlSanitizer();
}

如果設置了屬性 sanitizerType=REGEX(並且 SaxXmlSanitizer Bean 不存在),我如何編寫 Spring 引導測試以查看應用程序上下文中是否存在 RegExXmlSanitizer Bean,反之亦然如果設置了屬性 sanitizerType=SAX?

我試過了:

@Test
void testSanitizerExists() {
    this.contextRunner//.withPropertyValues("sanitizerType=SAX")
            .run(context -> Assertions.assertNotNull(context.getBean(SaxXmlSanitizer.class)));
}

但我總是得到一個

NoSuchBeanDefinitionException:沒有可用的“SaxXmlSanitizer”類型的合格 bean:預計至少有 1 個有資格作為自動裝配候選者的 bean。

我讓它這樣運行:

@SpringBootTest(classes = {RegExXmlSanitizer.class}, properties = {"sanitizerType=REGEX"})
@ActiveProfiles("test")
class RegExXmlSanitizerTest {

    @Autowired
    private RegExXmlSanitizer<DocumentContext> sanitizer;

    private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
            .withPropertyValues("sanitizerType=REGEX")
            .withConfiguration(AutoConfigurations.of(SanitizerTestConfig.class));

    @TestConfiguration
    static class SanitizerTestConfig {
        @Bean
        @ConditionalOnProperty(name = "sanitizerType", havingValue = "REGEX", matchIfMissing = true)
        public Sanitizer regExXmlSanitizer() {
            return new RegExXmlSanitizer();
        }
    }

    @Test
    void testSanitizerExists() {
        this.contextRunner.withPropertyValues("sanitizerType=SAX")
                .run(context -> Assertions.assertNotNull(context.getBean(RegExXmlSanitizer.class)));
    }
...
}

暫無
暫無

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

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