如何在Spring Boot中模拟数据库连接以进行测试?

时间:2016-02-29 19:03:26

标签: java spring junit spring-boot spring-test

情况:

  1. 我在微服务中使用Spring CloudSpring Boot,微服务正在加载数据库配置信息以配置连接。
  2. 我创建了一个测试,使用Swagger获取其余接口以供文档使用。
  3. 我想禁用数据库配置的加载,因为没有必要。
  4. 以下是代码:

    @WebAppConfiguration
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(classes = {Application.class, Swagger2MarkupTest.class}, loader = SpringApplicationContextLoader.class)
    @ActiveProfiles("test")
    
    public class Swagger2MarkupTest {
    
        @Autowired
        private WebApplicationContext context;
    
        private MockMvc mockMvc;
    
        @Autowired
        protected Environment env;
    
        @Before
        public void setUp() {
            this.mockMvc = MockMvcBuilders.webAppContextSetup(this.context).build();
        }
    
        @Test
        public void convertSwaggerToAsciiDoc() throws Exception {
            this.mockMvc.perform(get("/v2/api-docs").accept(MediaType.APPLICATION_JSON))
                    .andDo(Swagger2MarkupResultHandler.outputDirectory("target/docs/asciidoc/generated")
                            .withExamples("target/docs/asciidoc/generated/exampless").build())
                    .andExpect(status().isOk());
        }
    }
    

    如何在不加载数据库配置的情况下运行测试? 这可能吗?

1 个答案:

答案 0 :(得分:16)

可以选择使用简单的Spring功能来伪造Spring bean。您需要使用@Primary@Profile@ActiveProfiles注释。

I wrote a blog post on the topic.

您可以在内存DB(例如H2)中使用来替换实际数据源。像这样:

@Configuration
public class TestingDataSourceConfig {

    @Bean
    @Primary
    public DataSource dataSource() {
        return new EmbeddedDatabaseBuilder()
            .generateUniqueName(true)
            .setType(H2)
            .setScriptEncoding("UTF-8")
            .ignoreFailedDrops(true)
            .addScript("schema.sql")
            .addScripts("user_data.sql", "country_data.sql")
            .build();
    }
}