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

Posted

技术标签:

【中文标题】如何在 Spring Boot 中模拟数据库连接以进行测试?【英文标题】:How can I mock db connection in Spring Boot for testing purpose? 【发布时间】:2016-06-12 23:01:40 【问题描述】:

情况:

    我在微服务中使用Spring CloudSpring Boot,该微服务正在加载数据库配置信息以配置连接。 我创建了一个测试来获取其余接口,使用 Swagger 获取文档。 我想禁用加载数据库配置,因为没有必要。

代码如下:

@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】:

有一个选项可以使用简单的 Spring 特性来伪造 Spring bean。你需要为它使用@Primary@Profile@ActiveProfiles注解。

I wrote a blog post on the topic.

您可以使用内存数据库(例如 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();
    

【讨论】:

来自博客:从 Spring Boot 1.4.0 开始,通过注解 @MockBean 原生支持伪造 Spring Beans。阅读Spring Boot docs 了解更多信息。

以上是关于如何在 Spring Boot 中模拟数据库连接以进行测试?的主要内容,如果未能解决你的问题,请参考以下文章

如何模拟 JWT 令牌以将其与 Mockito 和 Spring Boot 一起使用

如何配置 Spring Boot 以使用两个数据库?

如何在 Spring Boot 测试中模拟 Spring amqp/rabbit

如何在 Java Spring boot 中模拟 RestTemplate?

如何在 Spring Boot 测试中模拟会话关闭/过期?

Spring Boot 集成测试:模拟环境接口