如何测试@Valid 注解是否有效?
How to test if @Valid annotation is working?
我有以下单元测试:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = {EqualblogApplication.class})
@WebAppConfiguration
@TestPropertySource("classpath:application-test.properties")
public class PostServiceTest {
// ...
@Test(expected = ConstraintViolationException.class)
public void testInvalidTitle() {
postService.save(new Post()); // no title
}
}
PostService
中save
的代码是:
public Post save(@Valid Post post) {
return postRepository.save(post);
}
Post
class 在大多数字段中用 @NotNull
标记。
问题是:没有抛出验证异常。
但是,这只发生在测试中。 使用应用程序正常运行验证并抛出异常。
注意:我想自动执行(保存时)而不是手动验证然后保存(因为它更现实)。
此解决方案适用于 Spring 5。它也适用于 Spring 4。 (我已经在 Spring 5 和 SpringBoot 2.0.0 上测试过了)。
必须具备三样东西:
- 在测试 class 中,提供一个用于方法验证的 bean(在您的示例中为 PostServiceTest)
像这样:
@TestConfiguration
static class TestContextConfiguration {
@Bean
public MethodValidationPostProcessor bean() {
return new MethodValidationPostProcessor();
}
}
- 在方法上有@Valid注解的class中,还需要在class层注解@Validated(org.springframework.validation.annotation.Validated)!
像这样:
@Validated
class PostService {
public Post save(@Valid Post post) {
return postRepository.save(post);
}
}
- 您必须在 class 路径中有 Bean Validation 1.1 提供程序(例如 Hibernate Validator 5.x)。实际提供者将由 Spring 自动检测并自动调整。
更多详情见MethodValidationPostProcessor documentation
希望对您有所帮助
这就是我将 ValidationAutoConfiguration.class
加载到上下文中的方法:
@SpringBootTest
@ContextConfiguration(classes = { MyComponent.class, ValidationAutoConfiguration.class
public class MyComponentValidationTest {
@Autowired
private MyComponent myComponent;
@Test
void myValidationTest() {
String input = ...;
// static import from org.assertj.core.api.Assertions
assertThatThrownBy(() -> myComponent.myValidatedMethod(input))
.isInstanceOf(ConstraintViolationException.class)
.hasMessageContaining("my error message");
}
}
和我的组件class:
@Component
@Validated
public class MyComponent {
public void myValidatedMethod(@Size(min = 1, max = 30) String input) {
// method body
}
)
我有以下单元测试:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = {EqualblogApplication.class})
@WebAppConfiguration
@TestPropertySource("classpath:application-test.properties")
public class PostServiceTest {
// ...
@Test(expected = ConstraintViolationException.class)
public void testInvalidTitle() {
postService.save(new Post()); // no title
}
}
PostService
中save
的代码是:
public Post save(@Valid Post post) {
return postRepository.save(post);
}
Post
class 在大多数字段中用 @NotNull
标记。
问题是:没有抛出验证异常。
但是,这只发生在测试中。 使用应用程序正常运行验证并抛出异常。
注意:我想自动执行(保存时)而不是手动验证然后保存(因为它更现实)。
此解决方案适用于 Spring 5。它也适用于 Spring 4。 (我已经在 Spring 5 和 SpringBoot 2.0.0 上测试过了)。
必须具备三样东西:
- 在测试 class 中,提供一个用于方法验证的 bean(在您的示例中为 PostServiceTest)
像这样:
@TestConfiguration
static class TestContextConfiguration {
@Bean
public MethodValidationPostProcessor bean() {
return new MethodValidationPostProcessor();
}
}
- 在方法上有@Valid注解的class中,还需要在class层注解@Validated(org.springframework.validation.annotation.Validated)!
像这样:
@Validated
class PostService {
public Post save(@Valid Post post) {
return postRepository.save(post);
}
}
- 您必须在 class 路径中有 Bean Validation 1.1 提供程序(例如 Hibernate Validator 5.x)。实际提供者将由 Spring 自动检测并自动调整。
更多详情见MethodValidationPostProcessor documentation
希望对您有所帮助
这就是我将 ValidationAutoConfiguration.class
加载到上下文中的方法:
@SpringBootTest
@ContextConfiguration(classes = { MyComponent.class, ValidationAutoConfiguration.class
public class MyComponentValidationTest {
@Autowired
private MyComponent myComponent;
@Test
void myValidationTest() {
String input = ...;
// static import from org.assertj.core.api.Assertions
assertThatThrownBy(() -> myComponent.myValidatedMethod(input))
.isInstanceOf(ConstraintViolationException.class)
.hasMessageContaining("my error message");
}
}
和我的组件class:
@Component
@Validated
public class MyComponent {
public void myValidatedMethod(@Size(min = 1, max = 30) String input) {
// method body
}
)