如何使用JUnit测试类的验证注释?

2022-08-31 12:13:52

我需要测试验证注释,但看起来它们不起作用。我不确定JUnit是否正确。目前,测试将通过,但如您所见,指定的电子邮件地址是错误的。

联合

public static void testContactSuccess() {
        Contact contact = new Contact();
        contact.setEmail("Jackyahoo.com");
        contact.setName("Jack");
        System.err.println(contact);
    }

要测试的类

public class Contact {

    @NotNull
    @Size(min = 1, max = 10)
    String name;

    @NotNull
    @Pattern(regexp="[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\."
            +"[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@"
            +"(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?",
                 message="{invalid.email}")
    String email;

    @Digits(fraction = 0, integer = 10)
    @Size(min = 10, max = 10)
    String phone;

    getters and setters

}

答案 1

另一个答案说“注释本身不做任何事情,你需要使用验证器来处理对象”是正确的,但是,答案缺乏有关如何使用验证器实例执行此操作的工作说明,这对我来说是我真正想要的。

Hibernate-validator是这种验证器的参考实现。你可以像这样干净利落地使用它:

import static org.junit.Assert.assertFalse;

import java.util.Set;

import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

public class ContactValidationTest {

    private Validator validator;

    @Before
    public void setUp() {
        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
        validator = factory.getValidator();
    }
    @Test
    public void testContactSuccess() {
        // I'd name the test to something like 
        // invalidEmailShouldFailValidation()

        Contact contact = new Contact();
        contact.setEmail("Jackyahoo.com");
        contact.setName("Jack");
        Set<ConstraintViolation<Contact>> violations = validator.validate(contact);
        assertFalse(violations.isEmpty());
    }
}

这假设您有验证器实现和 junit 作为依赖项。

使用 Maven pom 的依赖项示例:

<dependency>
    <groupId>org.hibernate</groupId>
    <version>5.2.4.Final</version>
    <artifactId>hibernate-validator</artifactId>
</dependency>
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>

答案 2

使用以下命令测试验证批注的简单方法:javax

在类级别声明:Validator

private final Validator validator = Validation.buildDefaultValidatorFactory().getValidator();

然后在测试中,只需在您需要验证的内容上调用它,并附上您正在验证的内容:objectexception

Set<TheViolation<TheClassYouAreValidating> violations = validator.validate(theInstanceOfTheClassYouAreValidating);

然后简单地说预期的违规次数:assert

assertThat(violations.size()).isEqualTo(1);

您需要将其添加到依赖项中 ():gradle

compile group: 'javax.validation', name: 'validation-api', version: '2.0.1.Final'


推荐