标签:spring-boot integration-testing java
我正在为项目编写集成测试,我想在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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。