- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个基于 SpringBoot 的命令行应用程序。该应用程序创建或删除数据库中的一些记录。它不是直接通过 JDBC 而是通过一个特殊的 API(实例变量 dbService
)来实现的。
应用类如下所示:
@SpringBootApplication
public class Application implements CommandLineRunner {
@Autowired
private DbService dbService;
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Override
public void run(String... args) {
// Do something via dbService based on the spring properties
}
}
现在我想创建一个 SpringBoot 测试,它将使用专门为测试准备的配置运行整个应用程序。
我使用在测试开始时为空的内存数据库 (H2) 运行测试。因此,我想将一些记录插入到数据库中——作为测试的设置。必须执行插入记录的代码
加载 Spring 上下文之后——这样我就可以使用 bean dbService
。
在应用程序运行之前——以便应用程序使用准备好的数据库运行。
不知何故,我没有做到以上两点。
我目前的情况是这样的:
@SpringBootTest
@DirtiesContext(classMode = ClassMode.AFTER_CLASS)
@ActiveProfiles("specialtest")
public class MyAppTest {
@Autowired
private DbService dbService;
private static final Logger logger = LoggerFactory.getLogger(MyAppTest.class);
// The expectation is that this method is executed after the spring context
// has been loaded and all beans created, but before the Application class
// is executed.
@EventListener(ApplicationStartedEvent.class)
public void preparedDbForTheTest() {
// Create some records via dbService
logger.info("Created records for the test");
}
// This test is executed after the application has run. Here we check
// whether the DB contains the expected records.
@Test
public void testApplication() {
// Check the DB contents
}
}
我的问题是 preparedDbForTheTest
方法似乎根本没有执行。
根据SpringBoot docs ,事件 ApplicationReadyEvent
恰好在我想要执行设置代码时发送。但是不知何故代码没有被执行。
如果我用 @Before...
注释该方法(我尝试了它的几种变体),那么它会被执行,但是之后 Application 类已经运行。
我做错了什么?
最佳答案
测试类不是 Spring 管理的 beans,所以像 @EventListener
方法这样的东西将被忽略。
您的问题最传统的解决方案是添加一些声明 @EventListener
的 @TestConfiguration
:
@SpringBootTest
@DirtiesContext(classMode = ClassMode.AFTER_CLASS)
public class MyAppTest {
private static final Logger logger = LoggerFactory.getLogger(MyAppTest.class);
@Test
public void testApplication() {
}
@TestConfiguration
static class DatabasePreparation {
@EventListener(ApplicationStartedEvent.class)
public void preparedDbForTheTest() {
logger.info("Created records for the test");
}
}
}
@TestConfiguration
是附加的,因此它将与应用程序的主要配置一起使用。 preparedDbForTheTest
方法现在将作为刷新测试应用程序上下文的一部分被调用。
请注意,由于应用程序上下文缓存,不会为每个测试调用此方法。它只会作为刷新上下文的一部分被调用,然后可以在多个测试之间共享。
关于spring-boot - 如何在应用程序运行之前在 SpringBootTest 中执行代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71087509/
我有一个具有以下结构的 Spring Boot 项目 src |--- main | |--- java | | |--- io.example.config | | |
目录 SpringBootTest 踩坑 SpringBootTest的一个小坑注意点 1、我当时运行SpringBoot测试类的时候踩这个坑
我靠@SpringBootTest在测试应用程序配置时非常重要。应用程序属性可能很复杂,具有默认值和重要的验证。例如: prop: ports: 1205,2303,4039 fqdn: ${
我正在使用 jasypt 加密 Spring Boot 应用程序中的 application.properties。我的目标是更新我的集成测试,以便 jasypt 与测试加密器密码一起使用。我的问题是
使用基于 Spring Boot 和 MongoDB 的一些端点实现微服务,并尝试使用 @SpringBootTest 注释功能编写集成测试. 目前,我面临一个问题,我需要预先填充一个嵌入式 Mong
我有一个类似于以下的代码: @RunWith(SpringRunner.class) @SpringBootTest public class ModelRunnerTest { @Autow
我的 SpringBootTest 注释无法解析为类型。这里有同样的问题,但似乎添加依赖项 org.springframework.boot spring-boot-starter-
我有一个带有数据库和 rabbitmq 用法的小型 Spring Boot 应用程序。 所以我想用集成测试(H2 + apache qpid)进行测试。 @ExtendWith(SpringExten
这就是单元测试的正确本质吗?我想我不明白我应该测试什么。 ConverterContext是一个策略类 @SpringBootTest @ExtendWith(SpringExtension.clas
我有一个正在测试 spring 应用程序部分的测试。它使用 SpringRunner 和注解 @SpringBootTest 所以它启动了一个完整的 spring 服务器。 问题是测试是由无法访问数据
我如何引导我的 Spring Boot 2 集成测试,以便在所有这些测试中我可以拥有一组配置,这些配置使用一些可用于所有集成测试的测试数据预先植入测试数据库? 最佳答案 假设您正在使用 h2 测试数据
目录 @SpringBootTest单元测试的坑 1、环境 2、遇到的问题 3、解决方式 Test类运行单元测试
我正在尝试在“干净”的上下文中运行 @SpringBootTest,而不执行 MyApplicationContextInitializer。 MyApplicationContextInitiali
我正在构建一个 Spring Boot 应用程序。我想像这样运行它: java -jar myjar.jar inputFile outputFile 我该如何写 @SpringBootTest为了
我有一个 @SpringBootTest 用于在服务器上执行集成测试。根据配置,我希望服务器的行为有所不同。配置本身由我的应用程序逻辑深处的 beans (scope = singleton) 读取,
我有一个带有 hibernate 功能的 SpringBoot 应用程序。在我的测试中,我想禁用任何类型的数据库连接和配置(测试无权访问数据库)。我该怎么做? 我的测试类用 @SpringBootTe
我想测试我的 WebSocket 应用程序。 测试类: @RunWith(SpringRunner.class) @SpringBootTest( webEnvironment = Sprin
我写了一个 ApplicationListener 应该检查环境是否在上下文初始化期间准备好。我在测试场景时遇到了麻烦,因为我在 configure() 和 main() 方法中手动添加了监听器。 应
我有一个简单的 Spring Boot 项目。 我正在使用 maven 进行依赖管理。 导入为 SpringBootTest不被认可,所以我得到: SpringBootTest cannot be r
我目前正在努力解决 SpringBootTest 实例的服务器端口注入(inject)问题。我编写了一个测试配置类,我想在其中访问此端口。 测试配置类: @Target(AnnotationTarge
我是一名优秀的程序员,十分优秀!