Sas*_*ota 10 java junit spring-boot spring-boot-test
我有在内存数据库上执行的集成测试.每个测试的签名看起来或多或少都像这样:
@RunWith(SpringRunner.class)
@SpringBootTest
@Sql("/clean-data-in-all-tables.sql")
public class SomeTest {
@Test
public void shouldDoSomehting() {}
}
Run Code Online (Sandbox Code Playgroud)
在测试上下文初始化期间,Hibernate会重新创建数据库模式:
spring:
jpa:
hibernate:
ddl-auto: create-drop
Run Code Online (Sandbox Code Playgroud)
我希望在初始化上下文之后和生成数据库模式之后执行sql脚本.但是在某些情况下clean-data-in-all-tables.sql,在生成模式之前执行它会失败,因为它需要尚未创建的表.
我按照我解释的方式编写了500多个测试,并且它们都运行良好,直到我添加了更多类似的测试.
当我通过Gradle或IntelliJ一起执行测试时,测试失败.请注意,失败的测试不是最近添加的测试.这是与我添加的测试完全无关的旧测试.同样奇怪的是,如果我通过IntelliJ 一个接一个地运行它们,那么失败的测试工作得很好.
它看起来像一个弹簧启动的错误,但我仍然试图找到一种方法来解决它.与此同时,我尝试了许多方法来解决这个问题,但是没有一个是有用的.
请分享您对可能有用的内容以及我的代码可能出现的问题的想法.
更新:
找到了解决方法:改变spring.jpa.hibernate.ddl-auto从create-drop以create解决问题.
但问题仍然是开放这种奇怪行为的原因是什么?
小智 2
一种可能的解决方案(我不确定您是否愿意使用 DBUnit)可以是:
1)创建抽象存储库集成测试:
@TestExecutionListeners({DbUnitTestExecutionListener.class})
@SpringApplicationConfiguration(classes = Application.class)
@DirtiesContext
public abstract class AbstractRepositoryIT extends AbstractTransactionalJUnit4SpringContextTests {
}
Run Code Online (Sandbox Code Playgroud)
2)创建“真正的”集成测试:
@DatabaseSetup(SomeEntityRepositoryIT.DATASET)
@DatabaseTearDown(type = DatabaseOperation.DELETE_ALL, value = {"dataset.xml})
public class SomeEntityRepositoryIT extends AbstractRepositoryIT {
...
}
Run Code Online (Sandbox Code Playgroud)
在文件 dataset.xml 中,您可以设置测试的初始状态等... 更多信息可以在此处找到
| 归档时间: |
|
| 查看次数: |
1177 次 |
| 最近记录: |