【发布时间】:2018-09-25 21:54:34
【问题描述】:
我正在为项目编写集成测试,我想在 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?
附: 我不能将 flyway 用于生产环境。或许可以仅将其用于测试?
更新: 经过一些实验,我在 test.yml 中设置了这个:
spring.jpa.hibernate.ddl-auto: none
现在它加载上下文,执行一项仅获取 Oauth2 令牌的测试,并在执行 POST 和 GET 请求的其他测试中失败,因为它无法执行在测试方法之前放置额外数据的 @sql 注释。数据库似乎没有受到任何影响,即没有任何表。
【问题讨论】:
标签: java spring-boot integration-testing