问题描述
我正在尝试使用Quarkus和Quarkus使用RestEasy进行测试,但是在每次测试之前设置虚拟数据时遇到了问题。
我正在尝试在调用端点之前使用Active Record模式插入用户。在向User实体询问用户数量时,在调用user.persistAndFlush()(或者只是调用.persist())之后,它正确地返回了数据库中有一条记录的信息。但是,当通过RestEasy调用端点时,它使我回想找不到该给定标识符的用户,实际上,当注销该服务中该特定方法调用中的用户数时,根据Quarkus,有0个用户。 在我看来,带有@Test批注的方法和服务本身在不同的上下文中运行?有点奇怪,我敢肯定会遗漏一些明显的东西。
这是我的测试班级的样子:
@QuarkusTest
@QuarkusTestResource(PostgresqlDatabaseResource.class)
public class AuthenticationResourceTest {
@TestHTTPEndpoint(AuthenticationResource.class)
@TestHTTPResource
URL url;
@BeforeEach
@Transactional
public void setUp() {
User.deleteall();
}
@Test
public void testWithNonExistingEmail() {
AuthenticationChallenge invalidAuthRequest = AuthenticationChallenge.builder()
.email("[email protected]")
.password("something")
.build();
given()
.when()
.contentType(ContentType.JSON)
.body(invalidAuthRequest)
.post(url)
.then()
.statusCode(401);
}
@Test
@Transactional
public void testWithValidAuthenticationChallenge() {
User user = User.builder()
.name("admin")
.role(Roles.ADMIN)
.status(Status.ACTIVE)
.password(BCrypt.withDefaults().hashToString(10,"admin".tochararray()))
.email("[email protected]")
.build();
user.persistAndFlush();
given()
.when()
.contentType(ContentType.JSON)
.body(AuthenticationChallenge.builder().email("[email protected]").password("admin").build())
.post(url)
.then()
.statusCode(200)
.log()
.all();
}
}
解决方法
在测试方法结束之前,您的用户将不会被保存到数据库中,因为它是事务性的,并且事务在最后提交。
通过REST调用,您可以在事务之外查询数据库,这样就不会有数据。
如果要初始化一些对REST调用可见的数据,则需要使用@BeforeEach
方法创建数据。