【发布时间】:2021-04-30 21:18:05
【问题描述】:
我正在尝试使用 Quarkus 学习一些新东西,但我有点卡住了:
我想创建一些自我维持的测试,我的意思是,我应该能够彼此独立地运行每个测试。
我正在使用 Testcontainers(PostgreSQL) 来运行一些组件测试,但我希望每个 @Test 能够在“干净的数据库”上运行,但我认为不会停止容器并为每个@Test 再次启动它是一个好主意。我可以有一个 @BeforeEach(container.dropColumn()) 或 @BeforeEach(container.truncateColumn()) 但是:1 - 我不知道这是否是更好的方法,2 - 我不知道该怎么做.
给定一个假设的测试场景:
场景 1 - 通过
- 注册新用户
- 按 id 查找用户
- 断言(one_user_on_db)
场景 2 - 失败
- 尝试使用无效数据注册新用户
- 查找所有用户
- 断言(zero_users_on_db)
第二个测试失败,因为第一个场景中的数据仍在数据库中。 在这里,一些代码可以提供帮助。
资源
@Inject
UserService userService;
@POST
@Transactional
public Response saveUser(@Valid UserDto user){
return Response.status(Response.Status.CREATED)
.entity(userService.saveUser(user, user.getPassword())).build();
}
@GET
public Iterable<User> findAll(){
return userService.findAll();
}
测试
@Test
void shouldSuccessfullyCreateUser(){
User mockUser = MockUser.onlyMandatoryFields() //MockUser
given()
.body(mockUser)
.contentType(ContentType.JSON)
.when()
.post("/users").prettyPeek()
.then()
.statusCode(Response.Status.CREATED.getStatusCode());
@Test
void shouldHaveAnEmptyDatabase(){
User[] userList = given()
.contentType(ContentType.JSON)
.when()
.get("/users").prettyPeek()
.then()
.extract()
.response()
.as(User[].class);
assertEquals(0, userList.length);
}
我已经按照Quarkus Docs 中的描述尝试了@TestTransaction,但没有成功。
我正在从Spring 寻找类似@DirtiesContext 的东西。
无论如何,如果您想进一步查看代码,我有一个开放的repository。 测试可以在here找到。
【问题讨论】:
-
@TestTransaction似乎很脆弱 - 例如,它不会回滚序列。我收到Duplicate entry '4-2' for key 'PRIMARY'之类的错误
标签: java postgresql junit5 quarkus testcontainers