首页 > 解决方案 > 测试 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启动。

标签: spring-bootspring-boot-test

解决方案


我会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));
    });

推荐阅读