gpt4 book ai didi

spring - 如何在 Spring Test 中注册 ApplicationEnvironmentPreparedEvent

转载 作者:行者123 更新时间:2023-12-03 23:54:08 29 4
gpt4 key购买 nike

我有一个 @SpringBootTest我需要通过 ApplicationEnvironmentPreparedEvent 通知如果它不存在,则创建一个数据库文件,因为我的应用程序数据库尝试连接到它并且它不存在。

我是通过 SpringApplicationBuilder 做的,但在 JUnit 中我无法访问此构建器。这是我现在的 main代码:

SpringApplicationBuilder appBuilder = new SpringApplicationBuilder();
appBuilder.headless(false);
appBuilder.listeners(new ApplicationListener<ApplicationEvent>() {
@Override
public void onApplicationEvent(ApplicationEvent event) {
if (event instanceof ApplicationEnvironmentPreparedEvent) {
Environment env = ((ApplicationEnvironmentPreparedEvent) event).getEnvironment();
String datasourceUrl = env.getProperty(RepositoryConfig.JDBC_URL_PROPERTY);

File db = FirebirdUtil.extractDatabaseFile(datasourceUrl);
if (db != null) {
String user = env.getProperty(RepositoryConfig.JDBC_USER_PROPERTY);
String password = env.getProperty(RepositoryConfig.JDBC_PASSWORD_PROPERTY);

// this will create the FDB file if it doesn't exists
FirebirdUtil.createDatabaseifNotExists(db, user, password);
}
}
}
});

我如何在 Enviroment 时收到通知准备好,在数据源配置之前读取JDBC URL并为测试创建数据库文件?

最佳答案

因为在测试中 main 方法没有运行,这就是为什么您的监听器在测试中不可用的原因。
首先,您需要提取该类的监听器以备将来在测试中使用(例如 MyListener )。
其次使用自定义加载程序在应用程序中声明监听器。

我只是检查它对我有用。
那是测试的例子:

@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration(loader = CustomLoader.class)
public class DemoApplicationTests {

public static class CustomLoader extends SpringBootContextLoader {

@Override
protected SpringApplication getSpringApplication() {
SpringApplication app = super.getSpringApplication();
app.addListeners(new MyListener());
return app;
}
}

关于spring - 如何在 Spring Test 中注册 ApplicationEnvironmentPreparedEvent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52085355/

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