嗨,我正在写一个springboot应用程序,我正在写单元和集成测试,但是我的集成测试失败了?
原因1:它试图通过执行 schema.sql
两次,因此表已经存在异常被抛出,测试失败。
理由二:即使我把 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 {
}
A测试和B测试 passes
他们试图从测试数据中获取一个记录,并且能够看到它。但是ctest fails
由于异常
Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "tbl_test" already exists; SQL statement:
因为里面有两个文件 test->resourece
文件夹 data.sql
以及 schema.sql
. 它试着运行它们两次
我的问题:
为什么脚本要执行两次?
为什么不三次,每次测试一次?
我能看出他们之间唯一的区别是 @SpringBootTest
与 @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE)
但它们仍然处于一个执行周期或上下文中,因此不应该发生。
当多次测试失败时,它为什么不失败 @SpringBootTest
(就像三个都有这样的注解)。
1条答案
按热度按时间bcs8qyzn1#
m。迪纳姆在评论中回答了这个问题:
因为上下文不同。一个运行在模拟环境中,另一个运行在没有web环境的环境中。由于这种差异,它将加载一个新的应用程序上下文。
对此进行一点扩展:spring测试基础设施缓存用于测试的应用程序上下文。如果使用相同的配置设置
ApplicationContext
在多个测试中ApplicationContext
将被重新使用。自
ATest
以及BTest
使用他们使用的相同配置ApplicationContext
示例。自从被处决后schema.sql
以及data.sql
在施工过程中发生ApplicationContext
他们只会被处决一次。CTest
使用不同的配置,因此ApplicationContext
必须重新创建,因此脚本将再次执行。