我编写用@SpringBootTest注释的集成测试。为了运行测试,我将测试资源中的 data.sql 中的数据插入到 H2 数据库中。
\n我遇到的情况是,第一次测试成功运行,经过多次后,出现错误,告诉我,H2 无法在表中插入数据,因为找不到该表。每次启动测试时都会出现不同的原始错误。在同一日志中,我看到在异常发生之前该表已创建,并且其他插入已成功执行。我看到我的 5 个测试中有 4 个是绿色的,一个是红色的。不同的时间可能有不同的测试。
\n重新启动 IDE 可使测试再次成功运行 3-4 次。之后,错误返回。
\n我尝试将 @DirtiesContext() 与我的测试类和测试方法一起使用,但它没有解决问题。
\n我猜测问题的根源可能在于我初始化数据库的方式。对于这两种数据库,我都使用一个 data.sql 文件的引用。我没有找到一种方法将它们分成不同的 *.sql 文件。
\n第二个猜测是在创建表之前就开始插入数据库。我现在通过将所有插入移动到测试代码中来检查这个理论。但我不确定这是否会有所帮助,因为我播种日志是在插入开始之前创建的表。
\n我在每次测试运行之前使用“mvn clean”。
\n我将非常感谢您在解决这个问题方面的建议。
\n我的实体:
\n@Entity\n@Table(name = "entity1", schema = "schema1")\n@Data\n@Builder\n@NoArgsConstructor\n@AllArgsConstructor\npublic class SomeEntityClass extends GenericEntity<Long> { ...}\n\n\n@MappedSuperclass\npublic abstract class GenericEntity<ID extends Serializable> implements Serializable {\n\n @Id\n @GeneratedValue(strategy = GenerationType.IDENTITY)\n @Column\n\n protected ID id;\n\n//getter, setter\n}\n\n
Run Code Online (Sandbox Code Playgroud)\n在我的 data.sql 文件中初始化看起来像这样:
\ncreate schema if not exists schema1;\ncreate schema if …
Run Code Online (Sandbox Code Playgroud)