SpringBootTest 失败 - 为什么在单个应用程序中测试 schema.sql 和 data.sql 执行两次?
SpringBootTest failing - Why in single application test schema.sql and data.sql is executed twice?
您好,我正在编写一个 SpringBoot 应用程序,我正在编写单元测试和集成测试,但是我的集成测试失败了?
原因 1: 它试图通过执行 schema.sql
两次来创建 table,因此抛出 table 已经存在的异常并且测试失败。
原因 2: 即使我输入 create if not exists
,它也会通过执行 data.sql
来插入失败,因为它会尝试第二次执行脚本并且发生唯一性约束冲突。我知道我可以在开始时删除 tables 或删除记录以消除错误。
But why it's running twice? not thrice or once?
初试
@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
文件夹中有 2 个文件 data.sql
和 schema.sql
。它尝试 运行 他们两次
我的问题:
- 为什么脚本执行了两次?
- 为什么不三次,每次测试一次?
- 我可以看到它们之间的唯一区别是
@SpringBootTest
与 @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE)
但它们仍然处于一个执行周期或上下文中,因此它不应该发生。
- 为什么当多个测试有
@SpringBootTest
时它不会失败(就像如果所有三个都有这个注释)。
米。 Deinum 在他的评论中回答了这个问题:
Because the context is different. One runs with a mock environment ht other with no web environment. Due to this difference it will load a new application context.
稍微扩展一下:Spring 测试基础架构缓存用于测试的应用程序上下文。如果您在多个测试中使用相同的配置来设置 ApplicationContext
,则 ApplicationContext
将被重复使用。
由于 ATest
和 BTest
使用相同的配置,因此它们使用 ApplicationContext
实例。由于 schema.sql
和 data.sql
的执行发生在 ApplicationContext
的构造期间,它们只执行一次。
CTest
使用不同的配置,因此 ApplicationContext
必须重新创建,因此脚本会再次执行。
您好,我正在编写一个 SpringBoot 应用程序,我正在编写单元测试和集成测试,但是我的集成测试失败了?
原因 1: 它试图通过执行 schema.sql
两次来创建 table,因此抛出 table 已经存在的异常并且测试失败。
原因 2: 即使我输入 create if not exists
,它也会通过执行 data.sql
来插入失败,因为它会尝试第二次执行脚本并且发生唯一性约束冲突。我知道我可以在开始时删除 tables 或删除记录以消除错误。
But why it's running twice? not thrice or once?
初试
@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
文件夹中有 2 个文件 data.sql
和 schema.sql
。它尝试 运行 他们两次
我的问题:
- 为什么脚本执行了两次?
- 为什么不三次,每次测试一次?
- 我可以看到它们之间的唯一区别是
@SpringBootTest
与@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE)
但它们仍然处于一个执行周期或上下文中,因此它不应该发生。 - 为什么当多个测试有
@SpringBootTest
时它不会失败(就像如果所有三个都有这个注释)。
米。 Deinum 在他的评论中回答了这个问题:
Because the context is different. One runs with a mock environment ht other with no web environment. Due to this difference it will load a new application context.
稍微扩展一下:Spring 测试基础架构缓存用于测试的应用程序上下文。如果您在多个测试中使用相同的配置来设置 ApplicationContext
,则 ApplicationContext
将被重复使用。
由于 ATest
和 BTest
使用相同的配置,因此它们使用 ApplicationContext
实例。由于 schema.sql
和 data.sql
的执行发生在 ApplicationContext
的构造期间,它们只执行一次。
CTest
使用不同的配置,因此 ApplicationContext
必须重新创建,因此脚本会再次执行。