如何告诉 Spring Boot 使用另一个数据库进行测试?

Posted

技术标签:

【中文标题】如何告诉 Spring Boot 使用另一个数据库进行测试?【英文标题】:How to tell Spring Boot to use another DB for test? 【发布时间】:2018-01-21 01:35:48 【问题描述】:

我希望 Spring Boot 使用与应用程序数据库相邻的 mysql 测试数据库进行集成测试。目前,它正在自动使用 H2 数据库,因为我在 Gradle 中添加了 H2 依赖项。

例如,这个测试现在使用 H2 数据库运行,我宁愿让它使用物理辅助数据库。

import org.junit.Test;
import org.junit.runner.RunWith;
import org.observer.media.model.MediaGroup;
import org.observer.media.repository.MediaGroupRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import static org.assertj.core.api.Assertions.assertThat;

@RunWith(SpringRunner.class)
@SpringBootTest
public class MediaGroupServiceTest 

    @Autowired
    private MediaGroupService mediaGroupService;
    @Autowired
    private MediaGroupRepository mediaGroupRepository;

    @PersistenceContext
    private EntityManager entityManager;

    private MediaGroup mediaGroup = new MediaGroup("name", "ceo", "owner");

    @Test
    public void save() 
        MediaGroup entity = mediaGroupService.saveNew(mediaGroup);

        assertThat(mediaGroupRepository.findByName(mediaGroup.getName())).isEqualTo(entity);
    

【问题讨论】:

可能与***.com/questions/28007686/…重复 【参考方案1】:

我在 /src/main/java/resources 中有 application.properties,其中包含主应用程序的数据源配置。

我将 application-test.properties 添加到 /src/test/java/resources,并将数据源配置添加到数据库进行测试。此外,我在应该使用该数据库的测试中添加了@ActiveProfiles("test")。请注意,Spring 在 application-test.properties 和注解中使用单词 test 来配置自己。因此,Spring “覆盖”了 application.properties 的配置。

application.properties:

spring.datasource.url=jdbc:mysql://localhost:3306/database
spring.datasource.username=user
spring.datasource.password=secret
spring.datasource.driverClassName=com.mysql.jdbc.Driver

应用程序测试属性:

spring.datasource.url=jdbc:mysql://localhost:3306/database_test
spring.datasource.username=user
spring.datasource.password=secret
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

【讨论】:

在测试类中使用@Commit,如果没有,我在db中看不到任何东西【参考方案2】:

虽然问题已经有了答案。

如果您想测试 JPA 应用程序,我们也可以使用 @DataJpaTest。默认情况下,它将配置一个内存嵌入式数据库,扫描@Entity 类并配置 Spring Data JPA 存储库。常规的 @Component bean 不会被加载到 ApplicationContext 中。

这是在 Spring Boot 应用程序中所做的测试改进之一。

阅读文档:https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-testing.html

【讨论】:

【参考方案3】:

在测试中默认使用内存数据库。您可以禁用该行为并让它使用应用程序配置的数据库,将注释@AutoConfigureTestDatabase(replace = Replace.NONE) 添加到您的测试中(请参阅Auto-configured Data JPA Tests)。

然后,您可以添加application.properties 或等效于src/test/resources 或单独的应用程序文件,例如application-test.properties,并通过使用@ActiveProfiles("test") 注释它们来使测试使用它。

【讨论】:

以上是关于如何告诉 Spring Boot 使用另一个数据库进行测试?的主要内容,如果未能解决你的问题,请参考以下文章

如何从另一个 Spring Boot 应用程序访问一个 Spring Boot 应用程序的内存 H2 数据库

如何从另一个新的 Spring Boot 项目调用一个 Spring Boot 项目中存在的 Spring Boot api

在 Spring Boot 中,啥告诉应用程序使用数据库? [复制]

如何从 Spring Boot 项目创建 jar,这个 jar 我们想在另一个 Spring Boot 应用程序中使用?

为独立的 Spring Boot 应用程序设置 MySQL 数据库以在另一个设备中使用

如何避免使用 Spring Boot 由另一个库配置外部库