Leo*_*eal 11 java junit dependency-injection spring-mvc entitylisteners
我@EntityListeners
在保存到Db之前和加载之后用来进行操作.在我的Listener类中,我调用了一个Ecryptor
(需要从配置文件中获取信息),因此加密器不能静态调用,需要在我的Listener中注入.对?
好吧,EntityListeners中的注入不能马上完成,但你有一些方法可以做到这一点,比如使用SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
甚至是这里显示的方法.https://guylabs.ch/2014/02/22/autowiring-pring-beans-in-hibernate-jpa-entity-listeners/
很酷,问题是:没有一个解决方案支持单元测试!当运行我在模型中注入的加密器测试时,Listener始终是null
.
这里SpringBeanAutowiringSupport不会在jUnit测试中注入bean有一个解决方案来创建这个上下文并传递给实例化的对象,但它没有解决我的问题,因为我有"注入"添加到它.
在我的测试中创建上下文的任何方式,并以某种方式将其传递给我的听众?如果没有,我可以用任何方式为我的加密器创建一个静态方法,并且仍然可以访问Environment API来读取我的属性吗?
包侦听器:
public class PackageListener{
@Autowired
Encryptor encryptor;
@PrePersist
public void preSave(final Package pack){
pack.setBic(encryptor.encrypt(pack.getBic()));
}
...
Run Code Online (Sandbox Code Playgroud)
我的考试
@Test
@WithuserElectronics
public void testIfCanGetPackageById() throws PackageNotFoundException{
Package pack = packagesServiceFactory.getPackageService().getPackage(4000000002L);
}
Run Code Online (Sandbox Code Playgroud)
套餐服务
public Package getPackage(Long id) throws PackageNotFoundException{
Package pack = packageDao.find(id);
if (pack == null) {
throw new PackageNotFoundException(id);
}
return pack;
}
Run Code Online (Sandbox Code Playgroud)
加密:
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;
}
...
Run Code Online (Sandbox Code Playgroud)
您可以创建一个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);
}
}
Run Code Online (Sandbox Code Playgroud)
然后您可以访问实体侦听器中的上下文
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()));
}
}
Run Code Online (Sandbox Code Playgroud)
为了让这个在你的 junit 测试中工作,只需在你的测试中添加初始化程序,如下所示......
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT, classes = Application.class)
@ContextConfiguration(classes = Application.class, initializers = DemoApplicationContextInitializer.class)
public class MyTest {
...
}
Run Code Online (Sandbox Code Playgroud)
它在我的环境中运行没有任何问题。希望对您也有帮助。
归档时间: |
|
查看次数: |
1205 次 |
最近记录: |