在单元测试期间,Spring bean未自动装入Custom Java Validator类

时间:2014-06-10 17:46:12

标签: spring validation unit-testing bean-validation spock

我有一个用Java验证框架注释注释的模型类。

@ValidClient
public class Client implements Serializable{
    private static final long SERIAL_VERSION_UID = 1L;
    @NotNull
    private Integer primaryKey;
    @NotEmpty
    private String id;
    @NotEmpty
    private String name;
    private Address address;
    ...
}

我写了一个自定义验证器类' ClientValidator'根据业务需求验证以下模型类。

public class ClientIdValidator implements ConstraintValidator<ValidClient, String> {
    @Autowired
    private IClientService service;

    private Map<String, Client> clientMap = null;

    @Override
    public void initialize(ValidClient constraintAnnotation) {
    }

    @Override
    public boolean isValid(String clientId, ConstraintValidatorContext context) {
        if(clientMap == null) {
            Map<String, Client> map = new ConcurrentHashMap<>();

            for (Client client : service.getAllClients()) {
                map.put(client.getId(), client);
            }
            clientMap = map;
        }

        return clientMap.get(clientId) !=null;
    }
}

正如您所看到的,我的自定义验证器是使用Spring bean自动装配的,它可以在生产代码中正常工作。但是,当我尝试为模型对象Client编写单元测试时,Spring自动连接字段IClientService service为空并且未自动装配。由于我无法访问实例化自定义验证器的实例,因此我不确定如何填充此自动装配字段。我想知道它是如何在生产代码中自动装配的,而不是在单元测试代码中。

下面是我写的Spock单元测试代码。

@ContextConfiguration(classes = [TestAppConfig.class])
class ClientTest extends Specification {
    def "test"(){
        expect:
        LocalValidatorFactoryBean validator = TestAppConfig.getApplicationContext().getBean("validator")
        def validator1 = validator.getValidator()
        validator1.validate(input)

        where:
        input | messageTemplates
        new Client() | "test"
    }
}

如何在单元测试时将IClientService的实例自动装入自定义验证器?

1 个答案:

答案 0 :(得分:0)

我通过从POJO中删除@ValidClient来解决它。这里不需要它,因为我用这个注释注释了我的方法参数。

通过删除自定义注释,现在正在调用默认验证器。