2016-06-28 31 views
1

我有以下單元測試:如何測試@Valid註釋是否工作?

@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 
    } 
} 

PostServicesave的代碼是:

public Post save(@Valid Post post) { 
    return postRepository.save(post); 
} 

Post的類被大多數領域標有@NotNull

問題是:沒有驗證異常拋出

但是,這隻發生在測試中。 使用應用程序通常運行驗證並引發異常。

注:我想自動執行(保存),而不是手動驗證,然後保存(因爲它更現實)。

+1

dupplicated。請參閱:http://stackoverflow.com/questions/13745848/how-to-test-valid –

+0

該解決方案只提供了一個編程方法:validator.validateProperty(object,propertyName) 我想保存一個隱式驗證 –

+0

解決方案用'@Inject MockMvc mvc;'對我很好看? –

回答

0

該解決方案適用於Spring 5.它也適用於Spring 4。 (我在Spring 5和SpringBoot 2.0.0上測試過它)。

有跡象表明,必須有三件事情:

    在測試類
  1. ,(在你的例子PostServiceTest)提供了方法驗證豆

像這樣:

@TestConfiguration 
static class TestContextConfiguration { 
    @Bean 
    public MethodValidationPostProcessor bean() { 
     return new MethodValidationPostProcessor(); 
    } 
} 
  1. 在具有@Valid註解方法的類中,還需要使用@Validated(org.springf ramework.validation.annotation.Validated)在課堂上!

像這樣:

@Validated 
class PostService { 
    public Post save(@Valid Post post) { 
     return postRepository.save(post); 
    } 
} 
  • 你必須有在類路徑Bean驗證1.1提供商(如Hibernate驗證5.x的)。實際的提供者將被Spring自動檢測並自動調整。
  • 的更多細節MethodValidationPostProcessor documentation

    希望幫助