数据库
首页 > 数据库> > java-在Spring上下文之前动态创建schema.sql

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