我有一个用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
的实例自动装入自定义验证器?
答案 0 :(得分:0)
我通过从POJO中删除@ValidClient来解决它。这里不需要它,因为我用这个注释注释了我的方法参数。
通过删除自定义注释,现在正在调用默认验证器。