Java 在新对象中初始化mock

Java 在新对象中初始化mock,java,spring,unit-testing,mockito,Java,Spring,Unit Testing,Mockito,我的类无法自动连接UserService-它抛出NullPointerException。我想找到一种测试UserValidator类的方法。我不知道如何在现有的ValidationRule类中注入mock public class ExistingValidationRule implements RegistrationRule<User> { @Autowired private UserService service; @Override public void valid

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

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);
}
公共类ExistingValidationRule实现注册规则{
@自动连线
私人用户服务;
@凌驾
公共无效验证(用户、用户错误){
服务。查找(用户、错误);
}
}
@组成部分
公共类UserValidator实现验证器{
@凌驾
公共无效验证(对象o、错误){
用户=(用户)o;
添加(新的现有ValidationRule());
for(注册规则:规则){
规则。验证(用户、错误);
}
}
}
公共类用户验证测试{
@注射模拟
私有用户验证程序;
@注射模拟
私有ExistingValidationRule ExistingValidationRule;
@嘲弄
私人用户服务;
@以前
公共作废设置(){
initMocks(this);
}
@试验
public void testValidUser()引发异常{
验证(createdUser,错误);
}
类用户验证程序
//如果您需要的所有角色都是Springbeans,那么请执行autowired,然后按超级类型执行
@自动连线
私人收藏角色;
@凌驾
公共无效验证(对象o、错误){
用户=(用户)o;
//所有Springbean配置的验证器都是自动连接的
对于(注册规则:规则){
规则。验证(用户、错误);
}
}

@组件
公共类UserValidator实现验证器{
//如果以前创建过规则
@自动连线
public void setExistingValidationRule(ExistingValidationRule ExistingValidationRule){
添加(existingValidationRule);
}
@凌驾
公共无效验证(对象o、错误){
用户=(用户)o;
for(注册规则:规则){
规则。验证(用户、错误);
}
}

并尽量避免在方法validate()中添加新的责任-就像添加新的验证器一样。方法validate应该只做验证,没有什么比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);
    }
}
公共类ExistingValidationRule实现注册规则{
@自动连线
私人用户服务;
公共ExistingValidationRule(用户服务){
服务=服务;
}
public ExistingValidationRule(){
}
@凌驾
公共无效验证(用户、用户错误){
服务。查找(用户、错误);
}
}
我添加了第二个空构造函数来让Spring开心。第一个应该可以为您的单元测试提供技巧


愉快的测试!

如果您使用
new
创建SpringBean实例,它们不再是SpringBean实例,因此无法由Spring自动连接,因为Spring无法知道该实例是否存在。将现有的ValidationRule实例自动连接到UserValidator。当您的大多数问题被否决时,您正在做一些事情兴致让很多人恼火。也许缺少家庭作业是答案。
@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);
    }
}
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);
    }
}