Tôi sử dụng @EntityListeners
để thực hiện các thao tác trước khi tôi lưu trong Db và sau khi tải. Bên trong lớp Listener của tôi, tôi thực hiện cuộc gọi đến Ecryptor
(cần lấy thông tin từ tệp cấu hình), vì vậy bộ mã hóa không thể được gọi tĩnh và cần được tiêm vào Trình nghe của tôi. Đúng?@EntityListeners Injection + jUnit Testing
Không thể thực hiện ngay việc tiêm trong EntityListeners, nhưng bạn có một số phương pháp để thực hiện điều đó, như sử dụng SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
hoặc thậm chí phương pháp được hiển thị ở đây. https://guylabs.ch/2014/02/22/autowiring-pring-beans-in-hibernate-jpa-entity-listeners/
Thật tuyệt, vấn đề là: Không có giải pháp nào hỗ trợ kiểm tra đơn vị! Khi chạy các kiểm tra mà bộ mã hóa mà tôi đã tiêm vào Trình nghe mô hình của mình luôn là null
.
Ở đây SpringBeanAutowiringSupport does not inject beans in jUnit tests Có một giải pháp để tạo ngữ cảnh này và chuyển đến một đối tượng được khởi tạo, nhưng nó không giải quyết được vấn đề của tôi vì tôi có "Tiêm" để thêm vào nó.
Bất kỳ cách nào để tạo ngữ cảnh trong các bài kiểm tra của tôi và bằng cách nào đó sẽ chuyển ngữ cảnh đó cho người nghe của tôi? Nếu không, bất kỳ cách nào tôi có thể tạo một phương pháp tĩnh để mã hóa của tôi và vẫn có quyền truy cập vào API môi trường để đọc các thuộc tính của tôi?
Gói Thính giả:
public class PackageListener{
@Autowired
Encryptor encryptor;
@PrePersist
public void preSave(final Package pack){
pack.setBic(encryptor.encrypt(pack.getBic()));
}
...
thử nghiệm của tôi
@Test
@WithuserElectronics
public void testIfCanGetPackageById() throws PackageNotFoundException{
Package pack = packagesServiceFactory.getPackageService().getPackage(4000000002L);
}
dịch vụ trọn gói
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;
}
...
Nếu nó là 'null' bạn không sử dụng ngữ cảnh. Kiểm tra của bạn làm cho tôi tự hỏi nếu bạn thậm chí sử dụng bối cảnh được tạo ra bởi các thử nghiệm (Tôi nghi ngờ nó nhìn vào những gì bạn đang làm trong thử nghiệm của bạn). –
Cảm ơn nhận xét của bạn @ M.Deinum, tôi đang tạo ngữ cảnh bằng cách sử dụng '@ContextConfiguration (classes = {ApplicationConfiguration.class})' trong lớp 'BaseTest' của tôi. Tất cả các thao tác tiêm và cấu hình hoạt động đúng cách, ngoài 'Encryptor' (được gọi từ EntityListener) –
Như đã nói, tôi nghi ngờ bạn đang thực sự sử dụng nó theo cách bạn đang có một dịch vụ ... –