Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot 使用spring boot liquibase对多个数据源不起作用的测试_Spring Boot_Unit Testing_Liquibase_Spring Boot Test - Fatal编程技术网

Spring boot 使用spring boot liquibase对多个数据源不起作用的测试

Spring boot 使用spring boot liquibase对多个数据源不起作用的测试,spring-boot,unit-testing,liquibase,spring-boot-test,Spring Boot,Unit Testing,Liquibase,Spring Boot Test,我正在为具有多个数据源的spring boot应用程序创建单元测试。(配置深受answer的启发) 及 应用程序正在正常运行 问题是此配置的单元测试失败。我使用了h2作为嵌入式数据库。添加h2作为测试依赖项,并在datasource URL以及application.yaml中添加h2用于测试 用于测试的应用程序.yaml management: endpoints.web.exposure.include: "*" security.enabled: false spring: z

我正在为具有多个数据源的spring boot应用程序创建单元测试。(配置深受answer的启发)

应用程序正在正常运行

问题是此配置的单元测试失败。我使用了
h2
作为嵌入式数据库。添加h2作为测试依赖项,并在datasource URL以及application.yaml中添加h2用于测试

用于测试的应用程序.yaml

management:
  endpoints.web.exposure.include: "*"
  security.enabled: false
spring:
  zipkin:
    discoveryClientEnabled: false
    sender:
      type: kafka
      #type: web
  liquibase:
    enabled: false
  datasource:
    url: "jdbc:h2:mem:testdb"
    jdbc-url: "jdbc:h2:mem:testdb"
    username: sa
    password:
  secondary-datasource:
    url: "jdbc:h2:mem:testdb"
    jdbc-url: "jdbc:h2:mem:testdb"
    username: sa
    password:
datasource:
 primary-liquibase:
   liquibase:
     url: "jdbc:h2:mem:testdb"
     username: sa
     password:
 secondary-liquibase:
   liquibase:
     url: "jdbc:h2:mem:testdb"
     username: sa
     password:
liquibase:
  enable: false
单元测试文件

package com.foo.bar.car;

import com.foo.bar.car.utils.KSUIDGenerator;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.boot.jdbc.EmbeddedDatabaseConnection;
import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
@AutoConfigureMockMvc
@AutoConfigureTestDatabase
// https://stackoverflow.com/a/58786742/1534925
//@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
//@AutoConfigureTestDatabase(connection = EmbeddedDatabaseConnection.H2)
class CarApplicationTests {

    @Test
    public void contextLoads() {
        String h = "Hello World!";
        Assertions.assertEquals(h, "Hello World!");
    }

    @Test
    public void testKSUIDGeneration() {
        Assertions.assertNotNull(KSUIDGenerator.generateKSUID());
    }
}
我创建了一个示例来演示这一点

当我执行
gradlew clean check
时,它会给出以下错误

Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [liquibase.integration.spring.SpringLiquibase]: Factory method 'primaryLiquibase' threw exception; nested exception is java.lang.IllegalArgumentException: No visible constructors in class org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration$EmbeddedDataSourceFactoryBean

不确定我缺少什么配置更改

要使其正常工作,需要进行几项调整:

  • 排除CarApplication.java中DB和Liquibase的自动配置

    @SpringBootApplication(exclude={DataSourceAutoConfiguration.class, LiquibaseAutoConfiguration.class})

  • 去掉配置中的
    sping
    前缀(应用程序内和测试属性)

  • 将liquibase变更日志位置添加到测试属性

  • 仔细检查下面的设置,以防在上面列出的所有调整之后它无法工作(我在这里和那里更改了一些东西,我通常以代码的方式使其舒适):

    CarApplication.java

    @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class, 
                                       LiquibaseAutoConfiguration.class })
    public class CarApplication {
      public static void main(String[] args) {
        SpringApplication.run(CarApplication.class, args);
      }
    }
    
    @Configuration
    public class DatabaseConfig {
    
        @Bean
        @Primary
        @ConfigurationProperties(prefix = "datasource")
        public DataSource primaryDataSource() {
            return DataSourceBuilder.create().build();
        }
    
        @Bean
        @ConfigurationProperties(prefix = "secondary-datasource")
        public DataSource secondaryDataSource() {
            return DataSourceBuilder.create().build();
        }
    
        @Bean
        @ConfigurationProperties(prefix = "datasource.liquibase")
        public LiquibaseProperties primaryLiquibaseProperties() {
            return new LiquibaseProperties();
        }
    
        @Bean("liquibase")
        public SpringLiquibase primaryLiquibase() {
            return springLiquibase(primaryDataSource(), primaryLiquibaseProperties());
        }
    
        @Bean
        @ConfigurationProperties(prefix = "secondary-datasource.liquibase")
        public LiquibaseProperties secondaryLiquibaseProperties() {
            return new LiquibaseProperties();
        }
    
        @Bean
        public SpringLiquibase secondaryLiquibase() {
            return springLiquibase(secondaryDataSource(), secondaryLiquibaseProperties());
        }
    
        private static SpringLiquibase springLiquibase(DataSource dataSource, LiquibaseProperties properties) {
            SpringLiquibase liquibase = new SpringLiquibase();
            liquibase.setDataSource(dataSource);
            liquibase.setChangeLog(properties.getChangeLog());
            liquibase.setContexts(properties.getContexts());
            liquibase.setDefaultSchema(properties.getDefaultSchema());
            liquibase.setDropFirst(properties.isDropFirst());
            liquibase.setShouldRun(properties.isEnabled());
            liquibase.setLabels(properties.getLabels());
            liquibase.setChangeLogParameters(properties.getParameters());
            liquibase.setRollbackFile(properties.getRollbackFile());
            return liquibase;
        }
    }
    
    @SpringBootTest
    class CarApplicationTests {
        @Test
        public void contextLoads() {
            String h = "Hello World!";
            Assertions.assertEquals(h, "Hello World!");
        }
        @Test
        public void testKSUIDGeneration() {
            Assertions.assertNotNull(KSUIDGenerator.generateKSUID());
        }
    }
    
    application.yaml

    server:
      port: 9999
    
    datasource:
      url: jdbc:postgresql://localhost:8888/foo
      jdbcUrl: jdbc:postgresql://localhost:5432/foo
      username: username
      password: password
      driverClassName: org.postgresql.Driver
      liquibase:
        change-log: classpath:db-changelog/primary.xml
    
    secondary-datasource:
      url: jdbc:postgresql://localhost:8888/bar
      jdbcUrl: jdbc:postgresql://localhost:5432/bar
      username: username
      password: password
      driverClassName: org.postgresql.Driver
      liquibase:
        change-log: classpath:db-changelog/secondary.xml
    
    datasource:
      url: "jdbc:h2:mem:testdb"
      jdbc-url: "jdbc:h2:mem:testdb"
      username: sa
      password:
      liquibase:
        change-log: classpath:db-changelog/primary.xml
    
    secondary-datasource:
      url: "jdbc:h2:mem:testdb"
      jdbc-url: "jdbc:h2:mem:testdb"
      username: sa
      password:
      liquibase:
        change-log: classpath:db-changelog/secondary.xml
    
    DatabaseConfig.java

    @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class, 
                                       LiquibaseAutoConfiguration.class })
    public class CarApplication {
      public static void main(String[] args) {
        SpringApplication.run(CarApplication.class, args);
      }
    }
    
    @Configuration
    public class DatabaseConfig {
    
        @Bean
        @Primary
        @ConfigurationProperties(prefix = "datasource")
        public DataSource primaryDataSource() {
            return DataSourceBuilder.create().build();
        }
    
        @Bean
        @ConfigurationProperties(prefix = "secondary-datasource")
        public DataSource secondaryDataSource() {
            return DataSourceBuilder.create().build();
        }
    
        @Bean
        @ConfigurationProperties(prefix = "datasource.liquibase")
        public LiquibaseProperties primaryLiquibaseProperties() {
            return new LiquibaseProperties();
        }
    
        @Bean("liquibase")
        public SpringLiquibase primaryLiquibase() {
            return springLiquibase(primaryDataSource(), primaryLiquibaseProperties());
        }
    
        @Bean
        @ConfigurationProperties(prefix = "secondary-datasource.liquibase")
        public LiquibaseProperties secondaryLiquibaseProperties() {
            return new LiquibaseProperties();
        }
    
        @Bean
        public SpringLiquibase secondaryLiquibase() {
            return springLiquibase(secondaryDataSource(), secondaryLiquibaseProperties());
        }
    
        private static SpringLiquibase springLiquibase(DataSource dataSource, LiquibaseProperties properties) {
            SpringLiquibase liquibase = new SpringLiquibase();
            liquibase.setDataSource(dataSource);
            liquibase.setChangeLog(properties.getChangeLog());
            liquibase.setContexts(properties.getContexts());
            liquibase.setDefaultSchema(properties.getDefaultSchema());
            liquibase.setDropFirst(properties.isDropFirst());
            liquibase.setShouldRun(properties.isEnabled());
            liquibase.setLabels(properties.getLabels());
            liquibase.setChangeLogParameters(properties.getParameters());
            liquibase.setRollbackFile(properties.getRollbackFile());
            return liquibase;
        }
    }
    
    @SpringBootTest
    class CarApplicationTests {
        @Test
        public void contextLoads() {
            String h = "Hello World!";
            Assertions.assertEquals(h, "Hello World!");
        }
        @Test
        public void testKSUIDGeneration() {
            Assertions.assertNotNull(KSUIDGenerator.generateKSUID());
        }
    }
    
    测试
    application.yaml

    server:
      port: 9999
    
    datasource:
      url: jdbc:postgresql://localhost:8888/foo
      jdbcUrl: jdbc:postgresql://localhost:5432/foo
      username: username
      password: password
      driverClassName: org.postgresql.Driver
      liquibase:
        change-log: classpath:db-changelog/primary.xml
    
    secondary-datasource:
      url: jdbc:postgresql://localhost:8888/bar
      jdbcUrl: jdbc:postgresql://localhost:5432/bar
      username: username
      password: password
      driverClassName: org.postgresql.Driver
      liquibase:
        change-log: classpath:db-changelog/secondary.xml
    
    datasource:
      url: "jdbc:h2:mem:testdb"
      jdbc-url: "jdbc:h2:mem:testdb"
      username: sa
      password:
      liquibase:
        change-log: classpath:db-changelog/primary.xml
    
    secondary-datasource:
      url: "jdbc:h2:mem:testdb"
      jdbc-url: "jdbc:h2:mem:testdb"
      username: sa
      password:
      liquibase:
        change-log: classpath:db-changelog/secondary.xml
    
    CarApplicationTest.java

    @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class, 
                                       LiquibaseAutoConfiguration.class })
    public class CarApplication {
      public static void main(String[] args) {
        SpringApplication.run(CarApplication.class, args);
      }
    }
    
    @Configuration
    public class DatabaseConfig {
    
        @Bean
        @Primary
        @ConfigurationProperties(prefix = "datasource")
        public DataSource primaryDataSource() {
            return DataSourceBuilder.create().build();
        }
    
        @Bean
        @ConfigurationProperties(prefix = "secondary-datasource")
        public DataSource secondaryDataSource() {
            return DataSourceBuilder.create().build();
        }
    
        @Bean
        @ConfigurationProperties(prefix = "datasource.liquibase")
        public LiquibaseProperties primaryLiquibaseProperties() {
            return new LiquibaseProperties();
        }
    
        @Bean("liquibase")
        public SpringLiquibase primaryLiquibase() {
            return springLiquibase(primaryDataSource(), primaryLiquibaseProperties());
        }
    
        @Bean
        @ConfigurationProperties(prefix = "secondary-datasource.liquibase")
        public LiquibaseProperties secondaryLiquibaseProperties() {
            return new LiquibaseProperties();
        }
    
        @Bean
        public SpringLiquibase secondaryLiquibase() {
            return springLiquibase(secondaryDataSource(), secondaryLiquibaseProperties());
        }
    
        private static SpringLiquibase springLiquibase(DataSource dataSource, LiquibaseProperties properties) {
            SpringLiquibase liquibase = new SpringLiquibase();
            liquibase.setDataSource(dataSource);
            liquibase.setChangeLog(properties.getChangeLog());
            liquibase.setContexts(properties.getContexts());
            liquibase.setDefaultSchema(properties.getDefaultSchema());
            liquibase.setDropFirst(properties.isDropFirst());
            liquibase.setShouldRun(properties.isEnabled());
            liquibase.setLabels(properties.getLabels());
            liquibase.setChangeLogParameters(properties.getParameters());
            liquibase.setRollbackFile(properties.getRollbackFile());
            return liquibase;
        }
    }
    
    @SpringBootTest
    class CarApplicationTests {
        @Test
        public void contextLoads() {
            String h = "Hello World!";
            Assertions.assertEquals(h, "Hello World!");
        }
        @Test
        public void testKSUIDGeneration() {
            Assertions.assertNotNull(KSUIDGenerator.generateKSUID());
        }
    }
    

    要使其正常工作,需要进行几项调整:

  • 排除CarApplication.java中DB和Liquibase的自动配置

    @SpringBootApplication(exclude={DataSourceAutoConfiguration.class, LiquibaseAutoConfiguration.class})

  • 去掉配置中的
    sping
    前缀(应用程序内和测试属性)

  • 将liquibase变更日志位置添加到测试属性

  • 仔细检查下面的设置,以防在上面列出的所有调整之后它无法工作(我在这里和那里更改了一些东西,我通常以代码的方式使其舒适):

    CarApplication.java

    @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class, 
                                       LiquibaseAutoConfiguration.class })
    public class CarApplication {
      public static void main(String[] args) {
        SpringApplication.run(CarApplication.class, args);
      }
    }
    
    @Configuration
    public class DatabaseConfig {
    
        @Bean
        @Primary
        @ConfigurationProperties(prefix = "datasource")
        public DataSource primaryDataSource() {
            return DataSourceBuilder.create().build();
        }
    
        @Bean
        @ConfigurationProperties(prefix = "secondary-datasource")
        public DataSource secondaryDataSource() {
            return DataSourceBuilder.create().build();
        }
    
        @Bean
        @ConfigurationProperties(prefix = "datasource.liquibase")
        public LiquibaseProperties primaryLiquibaseProperties() {
            return new LiquibaseProperties();
        }
    
        @Bean("liquibase")
        public SpringLiquibase primaryLiquibase() {
            return springLiquibase(primaryDataSource(), primaryLiquibaseProperties());
        }
    
        @Bean
        @ConfigurationProperties(prefix = "secondary-datasource.liquibase")
        public LiquibaseProperties secondaryLiquibaseProperties() {
            return new LiquibaseProperties();
        }
    
        @Bean
        public SpringLiquibase secondaryLiquibase() {
            return springLiquibase(secondaryDataSource(), secondaryLiquibaseProperties());
        }
    
        private static SpringLiquibase springLiquibase(DataSource dataSource, LiquibaseProperties properties) {
            SpringLiquibase liquibase = new SpringLiquibase();
            liquibase.setDataSource(dataSource);
            liquibase.setChangeLog(properties.getChangeLog());
            liquibase.setContexts(properties.getContexts());
            liquibase.setDefaultSchema(properties.getDefaultSchema());
            liquibase.setDropFirst(properties.isDropFirst());
            liquibase.setShouldRun(properties.isEnabled());
            liquibase.setLabels(properties.getLabels());
            liquibase.setChangeLogParameters(properties.getParameters());
            liquibase.setRollbackFile(properties.getRollbackFile());
            return liquibase;
        }
    }
    
    @SpringBootTest
    class CarApplicationTests {
        @Test
        public void contextLoads() {
            String h = "Hello World!";
            Assertions.assertEquals(h, "Hello World!");
        }
        @Test
        public void testKSUIDGeneration() {
            Assertions.assertNotNull(KSUIDGenerator.generateKSUID());
        }
    }
    
    application.yaml

    server:
      port: 9999
    
    datasource:
      url: jdbc:postgresql://localhost:8888/foo
      jdbcUrl: jdbc:postgresql://localhost:5432/foo
      username: username
      password: password
      driverClassName: org.postgresql.Driver
      liquibase:
        change-log: classpath:db-changelog/primary.xml
    
    secondary-datasource:
      url: jdbc:postgresql://localhost:8888/bar
      jdbcUrl: jdbc:postgresql://localhost:5432/bar
      username: username
      password: password
      driverClassName: org.postgresql.Driver
      liquibase:
        change-log: classpath:db-changelog/secondary.xml
    
    datasource:
      url: "jdbc:h2:mem:testdb"
      jdbc-url: "jdbc:h2:mem:testdb"
      username: sa
      password:
      liquibase:
        change-log: classpath:db-changelog/primary.xml
    
    secondary-datasource:
      url: "jdbc:h2:mem:testdb"
      jdbc-url: "jdbc:h2:mem:testdb"
      username: sa
      password:
      liquibase:
        change-log: classpath:db-changelog/secondary.xml
    
    DatabaseConfig.java

    @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class, 
                                       LiquibaseAutoConfiguration.class })
    public class CarApplication {
      public static void main(String[] args) {
        SpringApplication.run(CarApplication.class, args);
      }
    }
    
    @Configuration
    public class DatabaseConfig {
    
        @Bean
        @Primary
        @ConfigurationProperties(prefix = "datasource")
        public DataSource primaryDataSource() {
            return DataSourceBuilder.create().build();
        }
    
        @Bean
        @ConfigurationProperties(prefix = "secondary-datasource")
        public DataSource secondaryDataSource() {
            return DataSourceBuilder.create().build();
        }
    
        @Bean
        @ConfigurationProperties(prefix = "datasource.liquibase")
        public LiquibaseProperties primaryLiquibaseProperties() {
            return new LiquibaseProperties();
        }
    
        @Bean("liquibase")
        public SpringLiquibase primaryLiquibase() {
            return springLiquibase(primaryDataSource(), primaryLiquibaseProperties());
        }
    
        @Bean
        @ConfigurationProperties(prefix = "secondary-datasource.liquibase")
        public LiquibaseProperties secondaryLiquibaseProperties() {
            return new LiquibaseProperties();
        }
    
        @Bean
        public SpringLiquibase secondaryLiquibase() {
            return springLiquibase(secondaryDataSource(), secondaryLiquibaseProperties());
        }
    
        private static SpringLiquibase springLiquibase(DataSource dataSource, LiquibaseProperties properties) {
            SpringLiquibase liquibase = new SpringLiquibase();
            liquibase.setDataSource(dataSource);
            liquibase.setChangeLog(properties.getChangeLog());
            liquibase.setContexts(properties.getContexts());
            liquibase.setDefaultSchema(properties.getDefaultSchema());
            liquibase.setDropFirst(properties.isDropFirst());
            liquibase.setShouldRun(properties.isEnabled());
            liquibase.setLabels(properties.getLabels());
            liquibase.setChangeLogParameters(properties.getParameters());
            liquibase.setRollbackFile(properties.getRollbackFile());
            return liquibase;
        }
    }
    
    @SpringBootTest
    class CarApplicationTests {
        @Test
        public void contextLoads() {
            String h = "Hello World!";
            Assertions.assertEquals(h, "Hello World!");
        }
        @Test
        public void testKSUIDGeneration() {
            Assertions.assertNotNull(KSUIDGenerator.generateKSUID());
        }
    }
    
    测试
    application.yaml

    server:
      port: 9999
    
    datasource:
      url: jdbc:postgresql://localhost:8888/foo
      jdbcUrl: jdbc:postgresql://localhost:5432/foo
      username: username
      password: password
      driverClassName: org.postgresql.Driver
      liquibase:
        change-log: classpath:db-changelog/primary.xml
    
    secondary-datasource:
      url: jdbc:postgresql://localhost:8888/bar
      jdbcUrl: jdbc:postgresql://localhost:5432/bar
      username: username
      password: password
      driverClassName: org.postgresql.Driver
      liquibase:
        change-log: classpath:db-changelog/secondary.xml
    
    datasource:
      url: "jdbc:h2:mem:testdb"
      jdbc-url: "jdbc:h2:mem:testdb"
      username: sa
      password:
      liquibase:
        change-log: classpath:db-changelog/primary.xml
    
    secondary-datasource:
      url: "jdbc:h2:mem:testdb"
      jdbc-url: "jdbc:h2:mem:testdb"
      username: sa
      password:
      liquibase:
        change-log: classpath:db-changelog/secondary.xml
    
    CarApplicationTest.java

    @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class, 
                                       LiquibaseAutoConfiguration.class })
    public class CarApplication {
      public static void main(String[] args) {
        SpringApplication.run(CarApplication.class, args);
      }
    }
    
    @Configuration
    public class DatabaseConfig {
    
        @Bean
        @Primary
        @ConfigurationProperties(prefix = "datasource")
        public DataSource primaryDataSource() {
            return DataSourceBuilder.create().build();
        }
    
        @Bean
        @ConfigurationProperties(prefix = "secondary-datasource")
        public DataSource secondaryDataSource() {
            return DataSourceBuilder.create().build();
        }
    
        @Bean
        @ConfigurationProperties(prefix = "datasource.liquibase")
        public LiquibaseProperties primaryLiquibaseProperties() {
            return new LiquibaseProperties();
        }
    
        @Bean("liquibase")
        public SpringLiquibase primaryLiquibase() {
            return springLiquibase(primaryDataSource(), primaryLiquibaseProperties());
        }
    
        @Bean
        @ConfigurationProperties(prefix = "secondary-datasource.liquibase")
        public LiquibaseProperties secondaryLiquibaseProperties() {
            return new LiquibaseProperties();
        }
    
        @Bean
        public SpringLiquibase secondaryLiquibase() {
            return springLiquibase(secondaryDataSource(), secondaryLiquibaseProperties());
        }
    
        private static SpringLiquibase springLiquibase(DataSource dataSource, LiquibaseProperties properties) {
            SpringLiquibase liquibase = new SpringLiquibase();
            liquibase.setDataSource(dataSource);
            liquibase.setChangeLog(properties.getChangeLog());
            liquibase.setContexts(properties.getContexts());
            liquibase.setDefaultSchema(properties.getDefaultSchema());
            liquibase.setDropFirst(properties.isDropFirst());
            liquibase.setShouldRun(properties.isEnabled());
            liquibase.setLabels(properties.getLabels());
            liquibase.setChangeLogParameters(properties.getParameters());
            liquibase.setRollbackFile(properties.getRollbackFile());
            return liquibase;
        }
    }
    
    @SpringBootTest
    class CarApplicationTests {
        @Test
        public void contextLoads() {
            String h = "Hello World!";
            Assertions.assertEquals(h, "Hello World!");
        }
        @Test
        public void testKSUIDGeneration() {
            Assertions.assertNotNull(KSUIDGenerator.generateKSUID());
        }
    }