鉴于下面的示例,我希望MyConfig.getSrvConfig()
不会被调用,因此也不会对返回的对象执行任何验证。但是由于某种原因,验证被执行并且测试用例失败。这个设置有什么问题吗?
我知道如果我private MySrvConfigBean srvConfig
没有在声明时初始化,测试会通过——但我真的不想MySrvConfigBean
成为一个带有@ConfigurationProperties(prefix = "cfg.srvConfig")
注释的独立类。
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = { TestCaseConfiguration.class })
public class ConditionalConfigValidationTest {
@Autowired
private ApplicationContext applicationContext;
@Test
public void test() {
assertNotNull(applicationContext);
assertFalse("srvConfig must NOT be in context", applicationContext.containsBean("srvConfig"));
}
@Configuration
@EnableConfigurationProperties(value = { MyConfig.class })
public static class TestCaseConfiguration {
}
@Component
@Validated
@ConfigurationProperties(prefix = "cfg")
public static class MyConfig {
private MySrvConfigBean srvConfig = new MySrvConfigBean();
@Bean
@Valid
@Conditional(MyCondition.class)
public MySrvConfigBean getSrvConfig() {
return srvConfig;
}
public static class MySrvConfigBean {
@NotNull
private String name;
public String getName() {
return name;
}
}
}
public static class MyCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return false;
}
}
}
我们希望以这种方式使用它的原因是,因为我们随后能够以与在 YAML 文件中相同的方式在代码中构建配置,例如:(cfg
并且cfgA
是两个不同配置层次结构的“根”对象) .
cfg:
srvConfig:
name: Dude
clientConfig:
xxx: true
yyy: Muster
cfgA:
aaaConfig:
bbb: false
ccc: Dundy
dddConfig:
fff: 3
在这种情况下,感觉就像验证的执行(由@Valid
on触发getSrvConfig()
)是一个错误。