2017-07-06 60 views
0

我的類不能autowired UserService - 它拋出NullPointerException。我想找到一種方法來測試UserValidator類。我不知道如何在ExistingValidationRule類中注入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); 
} 
+0

如果使用'new'創建Spring bean實例,它們不再是Spring bean實例,因此Spring不能自動裝配,無法知道該實例是否存在。將ExistingValidationRule實例自動裝入UserValidator。 –

+0

當你的大部分問題被拒絕時,你正在做一些事情來惹惱很多人。也許缺乏作業就是答案。 –

回答

0
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()新的責任 - 像添加新的驗證。方法驗證應該只做驗證,沒有更多

0

@Autowired是一個Spring註釋,除非你用Spring測試運行器運行你的單元測試,這將不會做任何事情。

然而,Mockito的@InjectMocks只會填充你的領域與嘲笑,只要你提供一個構造函數來達到這些領域。請嘗試以下操作:

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); 
    } 
} 

我添加了第二個空的構造函數讓Spring變得快樂。第一個應該爲你的單元測試做竅門。

快樂測試!