Jak mokujesz w testach swój sevice?
Oznaczyłeś klasę jako component- Service, jednak gdzie z niego korzystasz, czy w wartsiwe repozytorium czy serwisu, mam na myśli w którym miejscu wykorzystujesz obiekt :
Dodatkowo, gdzie jest skonfigurowany @Bean którego definiujesz w komponencie @Service ( Generalnie - to jest nieprawidłowe, gdyż Bean powinien znajdować się w @Configuration ), spring nie użyje tego beana.
Więc jeśli na sztywno nie do implementujesz użycia tego beana to dlatego zwraca go null przez kontener
Zdefiniować obiekt poprzez adnotacje @Bean - oznaczyć go fasolką możesz tylko w klasie oznaczonej adnotacją @Configuration- jeśli nie rozbisz zewnętrznej konfiguracji z XML. W ten sposób określasz jaki obiekt i w jaki sposób chcemy stworzyć (w twoim przypadku PasswordEncoder).
Więć coś takiego
@Configuration
public class EncoderConfiguration {
@Bean
public PasswordEncoder passwordEncoder() {
// w ten sposób funkcja anonimowa
return new PasswordEncoder() {
@Override
public boolean matches(CharSequence rawPassword, String encodedPassword) {
return md5Encoder.getMD5Hash(rawPassword.toString()).equals(encodedPassword);
}
@Override
public String encode(CharSequence rawPassword) {
return md5Encoder.getMD5Hash(rawPassword.toString());
}
};
}
}
To jest definicja, potem na podstawie czegoś takie możesz automatycznie wiązać to do serwisu
@Service
public class PasswordHash() {
private PasswordEncoder passwordEncoder;
@Autowired
public UserService(PasswordEncoder passwordEncoder) {
this.passwordEncoder = passwordEncoder;
}
};
https://docs.spring.io/spring-security/site/docs/4.2.4.RELEASE/apidocs/org/springframework/security/crypto/password/PasswordEncoder.html
PasswordEncoder to interfejs dlatego należy w tym wypadku jeśli tworzymy ' w loce' funkcje anonimową i tzw obiekt typu interfejsu, należy zaimplementować w locie metody