java-在Spring上下文之前动态创建schema.sql
作者:互联网
我正在为项目编写集成测试,我想在Spring将其迁移到数据库之前将所有数据库迁移脚本合并到schema.sql中.
为此,我使用一个小类,该类在项目中搜索sql文件并将其合并为一个.
我已经创建了这样的套件:
@RunWith(Suite.class)
@Suite.SuiteClasses({MyTests.class})
public class SuiteTest {
@BeforeClass
public static void setUp() throws IOException {
RunMigrations.mergeMigrations();//this one merges all sqls into one file, called schema.sql
}
}
然后,这是我的测试:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = App.class)
@ActiveProfiles(resolver = CustomActiveProfileResolver.class)
@ContextConfiguration(classes = App.class)
public class MyTests extends AbstractTransactionalJUnit4SpringContextTests {
@PostConstruct
public void before() {
mvc = MockMvcBuilders.webAppContextSetup(context).addFilter(springSecurityFilterChain).build();
}
@Test
@Transactional
public void Test1(){ //do stuff }
}
但这并不像我想的那样有效.看起来Spring尝试运行schema.sql的速度比我创建它快,并且失败了:
Caused by: org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: missing table [application]
如果我只是关闭生成schema.sql的代码,并让Spring以已经创建的模式运行,那么一切都很好.但是,如果我删除schema.sql并让我的类生成它,则说明它将失败.
我试图在SpringJUnit4ClassRunner中重写run(RunNotifier notifier)方法,并将迁移合并放在其中,然后再调用super.run(notifier)方法,但这仍然行不通.
有没有一种方法可以在Spring获得它之前生成schema.sql?
附言
我不能将生产线用于生产环境.也许可以将其仅用于测试?
UPD:
经过一些实验后,我将其设置在test.yml中:
spring.jpa.hibernate.ddl-auto: none
现在,它加载上下文,执行一个仅获取Oauth2令牌的测试,而其他执行POST和GET请求的测试失败,因为它无法执行将附加数据放在测试方法之前的@sql批注.该数据库似乎未受影响,即没有任何表.
解决方法:
您可以通过使用@TestPropertySource(properties = {“ spring.flyway.enabled = true”})批注或通过使用其自己的属性文件创建测试Spring概要文件来仅针对测试启用flyway.后者看起来像:
@RunWith(SpringRunner.class)
@SpringBootTest
@ActiveProfiles("test")
public MyTest {
与src / test / resources / application-test.yml文件:
spring:
flyway:
enabled: true
和flyway-core作为测试范围的依赖项.
请注意,Spring Boot 2.0中的Spring Boot中的Flyway属性已重命名.
标签:spring-boot,integration-testing,java 来源: https://codeday.me/bug/20191109/2011620.html