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