2017-07-06 6 views
0

自分のクラスはAutowired UserServiceできません - NullPointerExceptionをスローします。私はUserValidatorクラスをテストする方法を探したいと思います。 ExistingValidationRuleクラスにモックを挿入する方法がわかりません。新しいオブジェクトのモックを初期化する

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

Spring Beanインスタンスを作成するために 'new'を使うと、Spring BeanインスタンスはもはやSpring Beanインスタンスではないため、このインスタンスが存在することを知る方法がないSpringによってautowiredできません。 UserValidatorにExistingValidationRuleインスタンスをオートワイヤします。 –

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

と方法の検証(の新しい責任を追加しないようにしてください) - のような新しいバリデータを追加します。メソッドのバリデーションはバリデーションのみを行うべきです

0

@Autowiredは春の注釈です。あなたがSpringテストランナーでユニットテストを実行しない限り、これは何もしません。

しかし、Mockitoの@InjectMocksは、それらのフィールドに到達するコンストラクタを提供している限り、フィールドをMocksで塗りつぶすだけです。以下を試してください:

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を幸せにするための2番目の空のコンストラクタを追加しました。最初のものはあなたのユニットテストのためのトリックを行う必要があります。

ハッピーテスト!

関連する問題