当前位置: 首页 > 知识库问答 >
问题:

在Spring上下文之前动态创建schema.sql

益光亮
2023-03-14

我正在为project编写集成测试,我希望在Spring将所有数据库迁移脚本导入到schema.sql之前将其合并到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的速度比我创建schema.sql的速度要快,但失败如下所示:

Caused by: org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: missing table [application]

附言。我不能在生产环境中使用flyway。也许它仅仅用于测试是可能的?

UPD:经过一些实验,我已经在test.yml中设置了这个:

spring.jpa.hibernate.ddl-auto: none

现在,它加载上下文,执行一个只获得Oauth2令牌的测试,并在执行POST和GET请求的其他测试中失败,因为它不能执行@SQL注释,这些注释将附加数据放在测试方法之前。数据库似乎没有被触及,也就是说没有任何表。

共有1个答案

秦禄
2023-03-14

您可以通过使用@testpropertysource(properties={“Spring.flyway.enabled=true”})注释或使用自己的属性文件创建testSpring概要文件来启用flyway。后者看起来像:

@RunWith(SpringRunner.class)
@SpringBootTest
@ActiveProfiles("test")
public MyTest {

使用src/test/resources/application-test.yml文件:

spring:
  flyway:
    enabled: true

flyway-core作为测试范围依赖项。

 类似资料:
  • 我将Spring Boot与Spring集成在一起,我希望为每个<code>child() 此时此刻,我正在处理这个:(只有最相关的行) 我已经查看了SpringApplication ationBuilder方法,并且属性从父亲传播到孩子: 但是我需要动态加载一些属性,如下例所示: 从此示例中提取:Spring多个 imapAdapter 这是因为一些Spring集成组件将从配置文件中动态加载。

  • 问题内容: 我已经阅读了动态bean定义的更改。我在一个简单的代码示例中进行了尝试(请参见下面的代码),并且在不想停止服务器但添加/更改bean定义的情况下,它非常吸引人。 问题: 这样做安全吗(请参见下面的代码)? 我读过,借助or 或?可以在运行时实现bean定义更改。那么区别是什么呢? final static String header = “<?xml version="1.0" enc

  • 我读过动态bean定义更改。我在一个简单的代码示例中尝试了它(参见下面的代码),我发现在不想停止服务器而是添加/更改bean定义的情况下,它非常有吸引力。 问题: null 和都允许我在运行时更改bean定义。但有什么不同,利/弊?

  • 所以我有一个项目,在其中我使用Spring boot,并希望利用一个模块系统。我希望模块系统能够动态地重新加载。我让它几乎可以工作,但是@ComponentScan在模块中完全不工作。 有一个模块文件夹,包含启动时加载的jar文件,需要动态卸载、加载和重新加载。 模块通过AnnotationConfigApplicationContext创建,上下文的类加载器设置为核心的类加载器,模块接口中的方法

  • 我需要从配置文件动态创建kafka流,其中包含每个流的源主题名称和配置。应用程序需要有几十个Kafka流和流将是不同的每个环境(例如阶段,prod)。它可能做到这一点与库? 我们可以通过轻松做到这一点: 我们需要实现spring接口,这样所有流都将自动启动和关闭。 是否可以使用做同样的事情?正如我所看到的,我们需要在代码中创建每个Kafka流,我看不到如何使用创建Kafka流列表的可能性。 但是如

  • 正如标题所示,我正在寻找任何可以帮助我在Springs应用程序上下文(准确地说是持久性上下文)加载之前运行Flyway迁移的方法。原因是我在应用程序启动时运行的查询很少。这导致我的测试失败,因为正在对尚不存在的数据库表执行查询。我使用H2作为我的测试数据库。现在我只使用flyway核心依赖: 我有一个单一的Flyway配置类,如下所示: 并且属性在 我想实现的是:1.飞行路线做迁移2。Spring