单元测试可以 mock 掉数据库,但集成测试需要真实环境。testcontainers 在测试时启动 docker 容器,用完后自动销毁。
一、引入依赖
<dependency>
<groupid>org.testcontainers</groupid>
<artifactid>testcontainers</artifactid>
<version>1.19.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupid>org.testcontainers</groupid>
<artifactid>mysql</artifactid>
<version>1.19.3</version>
<scope>test</scope>
</dependency>二、mysql 集成测试
@springboottest
@testcontainers
class userrepositorytest {
@container
static mysqlcontainer<?> mysql = new mysqlcontainer<>("mysql:8.0")
.withdatabasename("testdb")
.withusername("test")
.withpassword("test");
@dynamicpropertysource
static void configureproperties(dynamicpropertyregistry registry) {
registry.add("spring.datasource.url", mysql::getjdbcurl);
registry.add("spring.datasource.username", mysql::getusername);
registry.add("spring.datasource.password", mysql::getpassword);
}
@autowired
private userrepository userrepository;
@test
void testsaveandfind() {
user user = new user();
user.setname("张三");
user.setemail("zhangsan@test.com");
userrepository.save(user);
assertthat(user.getid()).isnotnull();
user found = userrepository.findbyid(user.getid()).orelse(null);
assertthat(found).isnotnull();
assertthat(found.getname()).isequalto("张三");
}
}
三、redis 集成测试
<dependency>
<groupid>org.testcontainers</groupid>
<artifactid>redis</artifactid>
<version>1.19.3</version>
<scope>test</scope>
</dependency>@springboottest
@testcontainers
class rediscachetest {
@container
static genericcontainer<?> redis = new genericcontainer<>(
dockerimagename.parse("redis:7-alpine"))
.withexposedports(6379);
@dynamicpropertysource
static void configureproperties(dynamicpropertyregistry registry) {
registry.add("spring.redis.host", redis::gethost);
registry.add("spring.redis.port", () -> redis.getmappedport(6379));
}
@autowired
private stringredistemplate redistemplate;
@test
void testsetandget() {
redistemplate.opsforvalue().set("test:key", "hello");
string value = redistemplate.opsforvalue().get("test:key");
assertthat(value).isequalto("hello");
}
}
四、共享容器
@testcontainers
abstract class abstractintegrationtest {
@container
static mysqlcontainer<?> mysql = new mysqlcontainer<>("mysql:8.0");
@container
static genericcontainer<?> redis = new genericcontainer<>(
dockerimagename.parse("redis:7-alpine"))
.withexposedports(6379);
@dynamicpropertysource
static void configureproperties(dynamicpropertyregistry registry) {
registry.add("spring.datasource.url", mysql::getjdbcurl);
registry.add("spring.datasource.username", mysql::getusername);
registry.add("spring.datasource.password", mysql::getpassword);
registry.add("spring.redis.host", redis::gethost);
registry.add("spring.redis.port", () -> redis.getmappedport(6379));
}
}
到此这篇关于springboot整合testcontainers实现数据库与中间件集成测试的文章就介绍到这了,更多相关springboot testcontainers集成测试内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论