如何解决SpringBootTest 失败 - 为什么在单个应用程序测试中 schema.sql 和 data.sql 执行两次?
嗨,我正在编写一个 SpringBoot 应用程序,我正在编写单元测试和集成测试,但是我的集成测试失败了?
原因 1:它尝试通过执行 schema.sql
两次来创建表,因此会抛出 table already exists 异常并且测试失败。
原因 2: 即使我放了 create if not exists
,它也会在第二次尝试执行脚本时执行 data.sql
导致插入失败,并且发生了唯一性约束冲突.我知道我可以在开始时删除表或删除记录以消除错误。
但是为什么它运行了两次?不是三次或一次?
第一次测试
@SpringBoottest(webEnvironment = SpringBoottest.WebEnvironment.NONE)
public class Atest {
}
第二次测试
@SpringBoottest(webEnvironment = SpringBoottest.WebEnvironment.NONE)
public class Btest {
}
第三次测试
@SpringBoottest
public class Ctest {
}
Atest 和 Btest 都 passes
并且他们尝试访问测试数据中的记录并且他们能够看到它。
但是 Ctest fails
由于异常
Caused by: org.h2.jdbc.JdbcsqlSyntaxErrorException: Table "tbl_test" already exists; sql statement:
因为 test->resourece
文件夹 data.sql
和 schema.sql
中有 2 个文件。它试图运行它们两次
我的问题:
- 为什么脚本会执行两次?
- 为什么不三次,每次测试一次?
- 我可以看到它们之间的唯一区别是
@SpringBoottest
与@SpringBoottest(webEnvironment = SpringBoottest.WebEnvironment.NONE)
,但它们仍然处于一个执行周期或上下文中,因此不应该发生。 - 为什么当多个测试都有
@SpringBoottest
时它不会失败(就像三个都有这个注释一样)。
解决方法
M。 Deinum 在他的评论中回答了这个问题:
因为上下文不同。一个在模拟环境下运行,另一个没有网络环境。由于这种差异,它将加载一个新的应用程序上下文。
稍微扩展一下:Spring 测试基础架构缓存用于测试的应用程序上下文。如果您在多个测试中使用相同的配置设置 ApplicationContext
,ApplicationContext
将被重复使用。
由于 ATest
和 BTest
使用相同的配置,因此它们使用 ApplicationContext
实例。由于 schema.sql
和 data.sql
的执行发生在 ApplicationContext
的构造过程中,因此它们只会执行一次。
CTest
使用不同的配置,因此 ApplicationContext
必须重新创建,因此脚本会再次执行。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。