为啥 H2 进行 spring-boot 测试,但它会将数据写入我的本地 mysql 数据库?

Posted

技术标签:

【中文标题】为啥 H2 进行 spring-boot 测试,但它会将数据写入我的本地 mysql 数据库?【英文标题】:why spring-boot test by H2, but it write data to my local mysql db?为什么 H2 进行 spring-boot 测试,但它会将数据写入我的本地 mysql 数据库? 【发布时间】:2017-12-10 09:50:42 【问题描述】:

Spring-boot 版本1.5.3.RELEASE;

application-test.yml 文件位置:../src/test/resources

spring:
  datasource:
    driver-class-name: org.h2.Driver
    url: jdbc:h2:mem:test;MODE=mysql
  profiles:
    active: test

而我的测试 BaseClass 是:

@RunWith(SpringRunner.class)
@SpringBootTest(
        classes = RestApiConfiguration.class,
        webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
)
@ActiveProfiles("test")
public class BaseRestApiTest 

    @Autowired
    protected TestRestTemplate restTemplate;


现在在扩展BaseRestApiTest 的测试类中,我将数据发布到http://127.0.0.1:8080/api/user/create 之类的URL,最后,用户数据被写入我的本地MySQL DB。

@Test
    public void testAdd() 
        String url = HOST + "/api/user/create";
        Map<String, Object> form = Maps.newHashMap();
        form.put("userId", 1);

        MultiValueMap<String, Object> params = new LinkedMultiValueMap<>(form.size());
        params.setAll(form);

        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.setContentType(MediaType.MULTIPART_FORM_DATA);

        HttpEntity<MultiValueMap<String, Object>> entity = new HttpEntity<>(params, httpHeaders);
        ResponseEntity<Long> resp = restTemplate.exchange(url, HttpMethod.POST, entity, Long.class);
        Assert.assertNotNull(resp.getBody());
    

期望用户数据刚刚写入内存中的H2,而不是我本地的MYSQL DB。

【问题讨论】:

【参考方案1】:

您的 BaseRestApiTest 已经用 @ActiveProfiles("test") 进行了标记,因此您需要在 application-test.yml 中包含以下内容:

spring:
jpa:
    database: HSQL

和一个依赖关系,在这个示例中,我使用了 Gradle,所以它是以下行:

    testCompile group: 'org.hsqldb', name: 'hsqldb'

ofc,如果你使用的是maven,需要在你的pom.xml文件中写成maven格式。

【讨论】:

以上是关于为啥 H2 进行 spring-boot 测试,但它会将数据写入我的本地 mysql 数据库?的主要内容,如果未能解决你的问题,请参考以下文章

Spring-Boot / H2 将数据库快照写入文件系统

使用放心的spring-boot集成测试

内存数据库spring-boot中的h2

为啥 Arraylist<String> 作为长且随机的字符串存储在 H2 数据库中?

spring-boot 文件系统中的持久 h2 数据库

为啥弹簧测试失败,不起作用@MockBean