在新对象中初始化模拟



我的类无法自动连接UserService - 它抛出NullPointerException。我想找到一种方法来测试UserValidator类。我不知道如何在现有验证规则类中注入模拟。

public class ExistingValidationRule implements RegistrationRule<User> {
@Autowired
private UserService service;
@Override
public void validate(User user, Errors errors) {
service.find(user, errors);
}
}

@Component
public class UserValidator implements Validator {
@Override
public void validate(Object o, Errors errors) {
User user = (User) o;
rules.add(new ExistingValidationRule());
for(RegistrationRule<User> rule : rules){
rule.validate(user, errors);
}
}
}
public class UserValidatorTest {
@InjectMocks
private UserValidator userValidator;
@InjectMocks
private ExistingValidationRule existingValidationRule;
@Mock
private UserService service;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
}
@Test
public void testValidUser() throws Exception{
userValidator.validate(createdUser,errors);
}
class UserValidator  
// if all roles that you need are spring beans- then do autowired then by super type
@Autowired 
privete Collection<RegistrationRule> roles ;
@Override
public void validate(Object o, Errors errors) {
User user = (User) o;
// all spring-bean configured validators were autowired 
for(RegistrationRule<User> rule : rules){ 
rule.validate(user, errors);
}
}

@Component
public class UserValidator implements Validator {
//if rules was created before
@Autowired
public void setExistingValidationRule(ExistingValidationRule existingValidationRule){
rules.add(existingValidationRule);
}
@Override
public void validate(Object o, Errors errors) {
User user = (User) o;
for(RegistrationRule<User> rule : rules){
rule.validate(user, errors);
}
}

并尽量避免在方法validate((中添加新的责任 - 就像添加新的验证器一样。 方法验证应该只做验证,仅此而已

@Autowired是一个 Spring 注释,除非你使用 Spring 测试运行器运行单元测试,否则这不会做任何事情。

但是,Mockito@InjectMocks只会用Mock填充您的字段,只要您提供一个构造函数来访问这些字段。请尝试以下操作:

public class ExistingValidationRule implements RegistrationRule<User> {
@Autowired
private UserService service;
public ExistingValidationRule(UserService service) {
this.service = service;
}
public ExistingValidationRule() {
}
@Override
public void validate(User user, Errors errors) {
service.find(user, errors);
}
}

我添加了第二个空构造函数,以使春天快乐。第一个应该为您的单元测试解决问题。

测试愉快!

最新更新