spring-boot - 测试 Spring Boot @ConfigurationProperties 验证失败
问题描述
我想为 a 编写一个测试@NotNull
,@NotEmpty
验证@ConfigurationProperties
.
@Configuration
@ConfigurationProperties(prefix = "myPrefix", ignoreUnknownFields = true)
@Getter
@Setter
@Validated
public class MyServerConfiguration {
@NotNull
@NotEmpty
private String baseUrl;
}
我的测试如下所示:
@RunWith(SpringRunner.class)
@SpringBootTest()
public class NoActiveProfileTest {
@Test(expected = org.springframework.boot.context.properties.bind.validation.BindValidationException.class)
public void should_ThrowException_IfMandatoryPropertyIsMissing() throws Exception {
}
}
当我运行测试时,它报告在测试运行之前无法启动应用程序:
***************************
APPLICATION FAILED TO START
***************************
Description:
Binding to target org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under 'myPrefix' to com.xxxxx.configuration.MyServerConfiguration$$EnhancerBySpringCGLIB$$4b91954c failed:
我怎么能期望一个例外来写一个否定的测试?即使我用应用程序替换它也BindException.class
无法Throwable.class
启动。
解决方案
我会ApplicationContextRunner
为此使用一个,例如
new ApplicationContextRunner()
.withConfiguration(AutoConfigurations.of(
ConfigurationPropertiesAutoConfiguration.class,
ValidationAutoConfiguration.class
))
.withUserConfiguration(MyServerConfiguration.class)
.withPropertyValues("foo=bar")
.run(context -> {
var error = assertThrows(IllegalStateException.class, () -> context.getBean(MyServerConfiguration.class));
var validationError = (BindValidationException) ExceptionUtils.getRootCause(error);
var fieldViolation = (FieldError) validationError.getValidationErrors().iterator().next();
var fieldInError = fieldViolation.getObjectName() + "." + fieldViolation.getField();
assertThat(fieldInError, is(expectedFieldInError));
assertThat(fieldViolation.getDefaultMessage(), is(expectedMessage));
});
推荐阅读
- python - np.random.norm 函数取平均值/标准差
- r - 从 dplyr 中的日期范围计算每年的观察值
- angular - 如何在另一个 FormArray 中访问 FormArray
- reactjs - React npm run build 不断失败
- sql - 如何编写排除是否存在查询
- html - 是否有一个 CSS 选择器可以用来在选中复选框后显示元素,无论它在页面上的什么位置?
- php - PHP 重定向 > 空白页
- python - rdflib 不解析 RDF/XML 文件
- django - 如果我有一个项目的单独模型和与该项目相关的图像的单独模型,我如何将它们组合到一个查询中?
- python - 希望根据列表中的名称创建团队生成器-Python