如何测试验证注释?

xen*_*ide 1 java unit-testing jpa

如何测试基于注释的验证?我知道它只适用于知道如何识别注释的东西,并且默认情况下测试框架(JUnit、TestNG)似乎无法识别这些。

public class Foo {

    @NotNull
    @Size(min = 2, max = 110)
    private String description;

    public method describe ( String desc ) {
       this.description = desc;
    }
}
Run Code Online (Sandbox Code Playgroud)

更新Foo.new.describe( ' ' ):例如,如果我这样做或,我将如何确保当我尝试设置描述时,它会抛出错误(如果由识别注释的事物使用)Foo.new.describe( null )

eve*_*ton 5

你的问题有点令人困惑。我将尝试回答这个问题的两个不同方面。

如何测试验证注释?

如果这些验证注释符合Java JSR-303 Bean 验证(这似乎是这种情况),您可以验证这些对象并使用Hibernate Validator或其他实现在单元测试上做出所需的断言。

例子:

public class FooTest {

   private static Validator validator;

   @BeforeClass
   public static void setUp() {
      ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
      validator = factory.getValidator();
   }

   @Test
   public void checkIfIsNull() {
      Foo foo = new Foo(); // Field is null at this point

      Set<ConstraintViolation<Car>> constraintViolations = validator.validate(foo);

      assertTrue(constraintViolations.size() > 0);
   }
}
Run Code Online (Sandbox Code Playgroud)

--

例如,如果我执行 Foo.new.describe(' ') 或 Foo.new,我将如何确保当我尝试设置描述时,它会抛出错误(如果由识别注释的事物使用)。描述(空)

您在这里讨论的是运行时验证,而不是单元测试。您可以这样检查并抛出推荐的异常:

public void describe(String desc) {
    if (desc == null || desc.trim().isEmpty())
        throw new IllegalArgumentException("[desc] parameter is null or empty");

    ...
}
Run Code Online (Sandbox Code Playgroud)

PS:这里我假设该describe(String)方法实际上不是setDescription(String).