gpt4 book ai didi

testing - 使用 Jooq 进行集成测试

转载 作者:行者123 更新时间:2023-11-28 20:48:18 24 4
gpt4 key购买 nike

如何在使用 JOOQ 作为数据访问层的 JUnit 中编写集成测试,以及测试完成后回滚?

似乎 Jooq 只提供非常有限的事务管理。它提供了一种方法

DSLContext.transaction(TransactionalRunnable transactional)

如果传递的 lambda 抛出异常,此方法将回滚事务。但是如何使它与 JUnit 集成测试一起工作并不明显。我真正想要的是不使用 Spring 的 @Transactional 接口(interface)的等价物。

@Transactional
class UserApiTest
{
UserApi api;

@Test
public void testUpdateUserLastName() {
User user = getUserByUsername();
user.setLastName("NewLastName");
api.updateUser(user);
assertEquals("NewLastName", user.getLastName());
// database should be unchanged after test completion because of automatic rollback
}
}

class UserApiImpl implements UserApi
{
private final DSLContext db;

@Override
public void updateUser(LegacyUser user) {
UserRecord userRecord = db.newRecord(USER, user);
db.executeUpdate(userRecord);
}
}

如有任何建议,我们将不胜感激。

最佳答案

比回滚更好的方法

首先,我建议您不要在此类集成测试中回滚事务,而是在测试后将数据库重置为已知状态。回滚失败的方式有很多种,例如:

  • 调用具有无论如何提交的自治事务的存储过程
  • 集成测试一些无论如何都会提交事务的服务
  • 由于数据库的事务模型导致问题的回滚

如果您将数据库重置为众所周知的状态,您将避免上述所有问题,这些问题可能会让您在测试维护方面花费更多。

使用像 https://www.testcontainers.org 这样的东西反而。这是一个显示如何设置它的示例:https://github.com/jOOQ/jOOQ/tree/main/jOOQ-examples/jOOQ-testcontainers-example

在测试结束时回滚

你不应该为此使用 jOOQ。您可以使用 Spring 的 JUnit 扩展,并进行所有测试 @Transactional。这样,无论何时出现断言错误,您都会自动回滚您的事务。此外,您的测试将自动成为事务性测试。

这适用于简单的场景,但同样,我相信您会遇到上述问题之一。

关于testing - 使用 Jooq 进行集成测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57443526/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com