为啥 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 数据库?的主要内容,如果未能解决你的问题,请参考以下文章