unit testing的良好模式形成了在Spring MVC中具有基于注释的validation的bean

对表单bean使用基于注释的validation时,为了确保为每个字段指定正确的validation注释,对这些bean进行unit testing的最佳做法是什么?

例如,如果您有:

public class MyForm { @NotNull private String name; } 

validation@NotNull是否适用于它的最佳方法是什么?

一个显而易见的方法是创建一个validation器,在它上面抛出一个null并期望它失败。 但在我看来,这不是最好的方法,因为你将使用它来测试@NotNull的行为和实现,而不是信任框架。

理想情况下,我希望使用reflection或实用程序,使我可以断言@NotNull (和任何其他)validation应用于给定字段,而不必发送未通过validation的各种值组合。

是否有一种优雅的方式来做到这一点,或者我是否在正确的轨道上?

您还可以使用validation工厂为您的Beans编写unit testing,这些测试使用JSR303进行注释。 参见示例: http : //musingsofaprogrammingaddict.blogspot.com/2009/02/using-bean-validation-with-spring.html

你应该考虑两件事:

不要测试您的第三方库/框架。

你应该依赖它们,它们应该已经由他们的维护者和周围的社区用户进行测试。 你不测试它们,而是评估它们。 确保它们符合您的需求并降低风险。

测试行为真的很重要!

在绝大多数应用程序中,实际UNIT测试几乎没有什么地方,因为业务逻辑要么很小,要么在应用程序的多个模块中广泛使用。 因此,您应该考虑集成测试,其优先级高于unit testing。 通过使用行为方法可以更容易地捕获这一点。

所以,要回答你的问题,你不应该尝试单独测试表单bean。 它只是一个运输对象。 您应该测试的是接收器如何对该forms做出反应,并检查正常情况和边缘情况。

你可以轻松测试它。

假设您正在使用Hibernate Validator。 或多或少,它应该是这样的

  import javax.validation.ConstraintViolation; import junit.framework.Assert; import org.hibernate.validator.HibernateValidator; import org.junit.Before; import org.junit.Test; import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean; private LocalValidatorFactoryBean localValidatorFactory; @Before public void setup() { localValidatorFactory = new LocalValidatorFactoryBean(); localValidatorFactory.setProviderClass(HibernateValidator.class); localValidatorFactory.afterPropertiesSet(); } @Test public void testNullValidationError() { final MyForm myForm= new MyForm (); myForm.setName(null); Set> constraintViolations = localValidatorFactory.validate(myForm); Assert.assertTrue("Your error message", constraintViolations.notNull == null); } 

我们测试bean属性的注释,作为表示层和spring容器之间集成测试的一部分。

我们所做的是创建假的MockPortletContext,DispatcherPortlet和MockRequests(这些类是spring-test库的一部分),填充请求,使它们看起来像真实的表单被提交,然后调用dispatcherPortlet。 (我们有portlet环境,但没关系)

然后你可以检查你的后端被approprietly调用,或者响应包含绑定结果与预期的validation错误,这是你需要的..