Używam @EntityListeners
do wykonywania operacji przed zapisaniem w Db i po załadowaniu. Wewnątrz mojej klasy Listener nawiązuję połączenie z Ecryptor
(która potrzebuje pobrać informacje z pliku konfiguracyjnego), więc nie można wywołać statycznego szyfratora i trzeba go wstrzyknąć do mojego odbiornika. Dobrze?@EntityListeners Injection + jUnit Testowanie
Cóż, zastrzyki w EntityListeners nie mogą być wykonane od razu, ale masz kilka metod, aby to zrobić, np. Używając SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
lub nawet metody pokazanej tutaj. https://guylabs.ch/2014/02/22/autowiring-pring-beans-in-hibernate-jpa-entity-listeners/
Fajnie, problem polega na tym, że: Żadne z rozwiązań nie obsługuje testów jednostkowych! Podczas uruchamiania testów, które zaszyfrowałem, wprowadziłem w moim modelu Listener jest zawsze null
.
Tutaj SpringBeanAutowiringSupport does not inject beans in jUnit tests Istnieje rozwiązanie do stworzenia tego kontekstu i przekazania do instancji obiektu, ale to nie rozwiązuje mojego problemu, ponieważ mam "wtrysk", aby go dodać.
Jakikolwiek sposób stworzyć kontekst w moich testach i jakoś przekazać go moim słuchaczom? Jeśli nie, w jaki sposób mogę utworzyć statyczną metodę do mojego Encryptor i nadal mam dostęp do środowiska API, aby przeczytać moje właściwości?
Pakiet Listener:
public class PackageListener{
@Autowired
Encryptor encryptor;
@PrePersist
public void preSave(final Package pack){
pack.setBic(encryptor.encrypt(pack.getBic()));
}
...
Moje testy
@Test
@WithuserElectronics
public void testIfCanGetPackageById() throws PackageNotFoundException{
Package pack = packagesServiceFactory.getPackageService().getPackage(4000000002L);
}
usługa Pakiet
public Package getPackage(Long id) throws PackageNotFoundException{
Package pack = packageDao.find(id);
if (pack == null) {
throw new PackageNotFoundException(id);
}
return pack;
}
Encryptor:
public class Encryptor{
private String salt;
public Encryptor(String salt){
this.salt = salt;
}
public String encrypt(String string){
String key = this.md5(salt);
String iv = this.md5(this.md5(salt));
if (string != null) {
return encryptWithAesCBC(string, key, iv);
}
return string;
}
...
Jeśli "null" nie używasz kontekstu. Twój test sprawia, że zastanawiam się, czy korzystasz nawet z kontekstu stworzonego przez test (wątpię, żeby spojrzał na to, co robisz w teście). –
Dziękuję za Twój komentarz @ M.Deinum, Tworzę kontekst używając '@ContextConfiguration (classes = {ApplicationConfiguration.class})' w mojej klasie 'BaseTest'. Wszystkie iniekcje i konfiguracje działają poprawnie, z wyjątkiem 'Encryptor' (wywoływanego z EntityListener) –
Jak już powiedziałem, wątpię, czy faktycznie używasz tego po sposobie uzyskiwania usługi ... –