gpt4 book ai didi

java - @EntityListeners 注入(inject) + jUnit 测试

转载 作者:搜寻专家 更新时间:2023-10-30 21:34:41 24 4
gpt4 key购买 nike

我使用 @EntityListeners 在保存到 Db 之前和加载之后进行操作。在我的 Listener 类中,我调用了一个 Ecryptor(它需要从配置文件中获取信息),因此不能静态调用加密器,需要将其注入(inject)到我的 Listener 中。对吧?

嗯,EntityListeners 中的注入(inject)不能立即完成,但您有一些方法可以做到这一点,例如使用 SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this); 甚至这里显示的方法。 https://guylabs.ch/2014/02/22/autowiring-pring-beans-in-hibernate-jpa-entity-listeners/

太好了,问题是:没有一个解决方案支持单元测试!在运行测试时,我在模型监听器中注入(inject)的加密器始终为 null

在这里SpringBeanAutowiringSupport does not inject beans in jUnit tests有一个创建此上下文并传递给实例化对象的解决方案,但它没有解决我的问题,因为我有“注入(inject)”要添加到它。

有什么方法可以在我的测试中创建上下文并以某种方式将其传递给我的听众?如果没有,我可以通过任何方式为我的加密器创建一个静态方法,并且仍然可以访问环境 API 来读取我的属性?

包监听器:

public class PackageListener{
@Autowired
Encryptor encryptor;

@PrePersist
public void preSave(final Package pack){
pack.setBic(encryptor.encrypt(pack.getBic()));
}
...

我的测试

 @Test
@WithuserElectronics
public void testIfCanGetPackageById() throws PackageNotFoundException{
Package pack = packagesServiceFactory.getPackageService().getPackage(4000000002L);
}

打包服务

  public Package getPackage(Long id) throws PackageNotFoundException{
Package pack = packageDao.find(id);

if (pack == null) {
throw new PackageNotFoundException(id);
}

return pack;
}

加密器:

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

最佳答案

您可以创建一个 DemoApplicationContextInitializer 类来将 appliationContext 引用存储在主类的静态属性中。

public class DemoApplicationContextInitializer implements
ApplicationContextInitializer<ConfigurableApplicationContext> {

@Override
public void initialize(ConfigurableApplicationContext ac) {
Application.context = ac;
}
}


@SpringBootApplication
public class Application {

public static ApplicationContext context;

public static void main(String[] args) throws Exception {
new SpringApplicationBuilder(Application.class)
.initializers(new DemoApplicationContextInitializer())
.run(args);
}
}

然后您可以在您的实体监听器中访问上下文

public class PackageListener{
//@Autowired
Encryptor encryptor;

@PrePersist
public void preSave(final Package pack){
encryptor = Application.context.getBean(Encryptor.class);
pack.setBic(encryptor.encrypt(pack.getBic()));
}
}

为了在你的 junit 测试中工作,只需像这样在你的测试中添加初始化程序......

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT, classes = Application.class)
@ContextConfiguration(classes = Application.class, initializers = DemoApplicationContextInitializer.class)
public class MyTest {
...
}

它在我的环境中没有任何问题。希望对你也有帮助。

关于java - @EntityListeners 注入(inject) + jUnit 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47590917/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com