springboottest失败-为什么在单个应用程序测试中schema.sql和data.sql执行两次?

tvz2xvvm  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(456)

嗨,我正在写一个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 (就像三个都有这样的注解)。

bcs8qyzn

bcs8qyzn1#

m。迪纳姆在评论中回答了这个问题:
因为上下文不同。一个运行在模拟环境中,另一个运行在没有web环境的环境中。由于这种差异,它将加载一个新的应用程序上下文。
对此进行一点扩展:spring测试基础设施缓存用于测试的应用程序上下文。如果使用相同的配置设置 ApplicationContext 在多个测试中 ApplicationContext 将被重新使用。
ATest 以及 BTest 使用他们使用的相同配置 ApplicationContext 示例。自从被处决后 schema.sql 以及 data.sql 在施工过程中发生 ApplicationContext 他们只会被处决一次。 CTest 使用不同的配置,因此 ApplicationContext 必须重新创建,因此脚本将再次执行。

相关问题