【问题标题】:Data not being retrieved from embedded H2 datasource in springboot test在 Spring Boot 测试中未从嵌入式 H2 数据源中检索数据
【发布时间】:2016-01-29 13:30:15
【问题描述】:

我以前使用过这种技术并明确指定所有配置。日志表明它正在创建数据源并加载脚本:

o.s.j.d.e.EmbeddedDatabaseFactory - Starting embedded database: url='jdbc:h2:mem:balancer;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false', username='sa'
o.s.j.d.i.ScriptUtils - Executing SQL script from class path resource [db/migration/V1_0001__create_queue_server_table.sql]
o.s.j.d.i.ScriptUtils - Executed SQL script from class path resource [db/migration/V1_0001__create_queue_server_table.sql] in 20 ms.
o.s.j.d.i.ScriptUtils - Executing SQL script from class path resource [db/migration/V1_0002__queue_server_entries.sql]
o.s.j.d.i.ScriptUtils - Executed SQL script from class path resource [db/migration/V1_0002__queue_server_entries.sql] in 8 ms.
o.s.o.j.LocalContainerEntityManagerFactoryBean - Building JPA container EntityManagerFactory for persistence unit 'default'

我能够调用 REST web 服务,并且调用通过存储库但没有返回任何内容。该应用程序在连接到 mysql 并返回加载的数据时工作正常。我看不到 WRT 配置缺少什么:

测试用例:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = {QueueServiceApplication.class, TestConfig.class})
@WebAppConfiguration
@ActiveProfiles({"test"})
public class QueueServiceApplicationTests {

    private static final int EXPECTED_SERVER_COUNT = 10;

    @Autowired
    private WebApplicationContext webCtx;

    private MockMvc mvc;

    @Before
    public void init() {
        mvc = MockMvcBuilders.webAppContextSetup(webCtx).build();
    }

    @Test
    public void successListAll() throws Exception {
    mvc.perform(get("/listall")).andExpect(status().isOk())
            .andExpect(content().contentType(MediaType.APPLICATION_JSON))
            .andExpect(jsonPath("$", hasSize(EXPECTED_SERVER_COUNT)));


    }
}

嵌入式数据源的测试配置对象:

@Configuration
@Profile("test")
public class TestConfig {
    @Bean
    public DataSource dataSource() {
        return new EmbeddedDatabaseBuilder()
            .addScript("classpath:/db/migration/V1_0001__create_queue_server_table.sql")
            .addScript("classpath:/db/migration/V1_0002__queue_server_entries.sql")
            .setType(EmbeddedDatabaseType.H2)
            .setName("vitel-balancer")
            .setScriptEncoding("UTF8")
            .build();
    }
}

启动器:

@SpringBootApplication
public class QueueServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(QueueServiceApplication.class, args);
    }
}

我使用的是 spring-boot 1.3.2,java 8 update 72

【问题讨论】:

    标签: unit-testing spring-boot datasource


    【解决方案1】:

    我已经能够通过更改我的 TestConfig 类来解决这个问题

    @Configuration
    @Profile("test")
    public class TestConfig {
    
        @Bean
        public DataSource dataSource() {
            return new EmbeddedDatabaseBuilder()
                    .setType(EmbeddedDatabaseType.H2)
                    .build();
        }
    
        @Bean
        public ResourceDatabasePopulator populator() {
            ResourceDatabasePopulator pop = new ResourceDatabasePopulator();
            pop.addScript(new ClassPathResource("db/migration/V1_0001__create_queue_server_table.sql"));
            pop.addScript(new ClassPathResource("db/migration/V1_0002__queue_server_entries.sql"));
            pop.setContinueOnError(true);
    
            return pop;
        }
    
        @Bean
        public DataSourceInitializer dbInit(DataSource ds, ResourceDatabasePopulator populator) {
            DataSourceInitializer init = new DataSourceInitializer();
            init.setDataSource(ds);
            init.setDatabasePopulator(populator);
            init.setEnabled(true);
    
            return init;
        }
    }
    

    我不确定为什么这与使用 EmbeddedDatabaseBuilder 并向其中添加脚本不同。如果有解释就太好了

    【讨论】:

      猜你喜欢
      • 2017-10-23
      • 2018-06-13
      • 2013-03-14
      • 2018-01-11
      • 2017-07-11
      • 2018-10-09
      • 2019-05-17
      • 2018-04-16
      • 2011-01-02
      相关资源
      最近更新 更多