3

クラス検証テストに関するHibernateのドキュメントを読んでいますが、「問題」の解決策が見つかりませんでした。カスタムバリデーターをテストしたいと思います。たとえば、次のクラスがあるとします。

public class User {

    @NotEmpty(message = "{username.notSpecified}")
    private String username;

    @NotEmpty
    @Size(min = 6, message = "{password.tooShort")
    private String password;

    @NotEmpty(message = "{city.notSpecified}")
    private String city;

    /* getters & setters omitted */
}

そして、すべてのユーザーがバルセロナ市にいることを確認したいと思います。そのために、次のようにカスタム ユーザー バリデーターを実装します。

public class UserValidator implements Validator {

    @Autowired 
    private Validator validator;

    @Override
    public boolean supports(Class<?> clazz) {
        return User.class.equals(clazz);
    }

    @Override
    public void validate(Object target, Errors errors) {
         validator.validate(target,errors);
         User user = (User) target;
         if(!(user.getCity().equals("Barcelona"))){
              errors.rejectValue("city", "city.notValid", "Invalid city"); 
         }
    }

}

例で提供されているデフォルトのバリデーターの代わりにこのカスタムバリデーターを使用する方法がわかりません。これは、注釈付きのフィールド制約のみをチェックし、「ビジネスロジック」のものはチェックしません。それに関する例や手がかりはありますか?

ありがとう!

4

3 に答える 3

9

単体テスト用にスプリング Validator を実装する必要はありません。そのための javax.validation.Validator インスタンスを作成するだけです。

import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;

import java.util.*;

import javax.validation.*;

import org.junit.*;

public class ApplierDtoUnitTests {

    private Validator validator = Validation.buildValidatorFactory().getValidator();
    private ApplierDto target = new ApplierDto();


    @Test
    public void brokenIfNullNameGiven() throws Exception {

        target.setName(null);

        Set<ConstraintViolation<ApplierDto>> constraintViolations = validator
            .validate(target);
        assertThat("unexpected size of constraint violations",
            constraintViolations.size(), equalTo(1));
    }
}

そして、バリデーターを使用して、私の経験では「ビジネスロジック」ではなく、フォームまたは RPC リクエストを検証したいと考えています。私の観点からは、ドメイン層でそれらを使用するのは簡単ではありません。

于 2013-07-11T15:41:05.577 に答える
1

私は最終的に解決策を見つけました:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"/test-applicationContext.xml"})
public class UserValidatorTest {

    private static Logger logger = Logger.getLogger(UserValidatorTest.class);

    @Autowired
    private UserValidator validator;  //my custom validator, bean defined in the app context

    @Test
    public void testUserValidator(){
        User user = new User("name", "1234567", "Barcelona");
        BindException errors = new BindException(user, "user");
        ValidationUtils.invokeValidator(validator, user, errors);
        Assert.assertFalse(errors.hasErrors());
    }

}

検証グループ (「グループ」が指定された任意の注釈) をチェックしましたが、invokeValidator 静的メソッドでも動作しています (単にエラー パラメーターの後に追加するだけです)。

于 2013-07-11T18:03:44.090 に答える