当前位置: 首页 > 知识库问答 >
问题:

如何使用JOOQ测试事务方法

常雪风
2023-03-14

我试图做一些测试,看看我的事务方法是否工作正常。然而,我不完全理解我是否应该嘲笑数据库,以及JOOQ是如何进入这个等式的。下面是Service类,其中包含向数据库添加角色的事务。

    @Service
    public class RoleService implements GenericRepository<Role>
    {
        @Autowired
        private DSLContext roleDSLContext;
    
        @Override
        @Transactional
        public int add(Role roleEntry)
        {
            return roleDSLContext.insertInto(Tables.ROLE,
                            Tables.ROLE.NAME,
                            Tables.ROLE.DESCRIPTION,
                            Tables.ROLE.START_DATE,
                            Tables.ROLE.END_DATE,
                            Tables.ROLE.ID_RISK,
                            Tables.ROLE.ID_TYPE,
                            Tables.ROLE.ID_CONTAINER)
                    .values(roleEntry.getName(),
                            roleEntry.getDescription(),
                            roleEntry.getStartDate(),
                            roleEntry.getEndDate(),
                            roleEntry.getIdRisk(),
                            roleEntry.getIdType(),
                            roleEntry.getIdContainer())
                    .execute();
        }
    }

我使用MySQL和连接到数据库是使用Spring配置文件

    spring.datasource.url=jdbc:mysql://localhost:3306/role_managementverifyServerCertificate=false&useSSL=true
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

我假设不必每次测试事务并在完成后关闭连接时都重新连接到数据库。我知道有

MockDataProvider provider = new MockDataProvider()

但我不明白它是怎么工作的。

测试上述方法的最佳方法是什么?

共有1个答案

程淮晨
2023-03-14

你读过jOOQ手册中关于数据库模拟的重要免责声明吗?

免责声明:使用这个jOOQ API模拟JDBC连接的一般想法是使用非常简单的JDBC抽象提供快速的变通方法、注入点等。不建议使用此模拟API模拟整个数据库(包括复杂的状态转换、事务、锁定等)。一旦您有了这个需求,请考虑使用实际的数据库产品来代替集成测试,而不是在MockDataProvider中实现您的测试数据库。

非常推荐您使用testcontainers之类的工具来集成测试您的应用程序,而不是通过jOOQ的mock SPI(或任何其他模拟方式)实现您自己的“数据库产品”。

要回答您的实际问题,您可以以编程方式配置您的DSLContext,例如使用:

@Bean
public DSLContext getDSLContext() {
    if (testing)
        return // the mocking context
    else
        return // the actual context
}

现在,向上面包含DSLContextbean配置的配置类中注入一些Spring配置文件值,或者其他任何内容,就可以了。

 类似资料:
  • 问题内容: 我已经看到了一些与此相关的问题,但是对于我的特定问题,我似乎无法理解任何答案。 我有一个模拟对象,让我们调用“ object1”,将其发送到某种测试方法,让我们调用testMethod()。所以我最后打电话 用于检测。现在在这个testMethod的某个地方,它将有一部分调用方法 这是一个无效方法。如果方法像 它实际上会返回什么,我通常会这样做 但是,这是一个无效方法,我只想测试一下它

  • 问题内容: 我已经开始发现Mockito库,并且有一个我没有找到正确答案的问题。 例如,如果我的UserDAO类中有将用户保存到数据库中的此类方法: 我应该如何测试? 如果我想测试一个DAO类,那么我需要创建一个模拟,模拟,模拟等吗?如此不测试数据库本身? 但是,如果我还想测试dao和数据库的行为怎么办? 您能否提供一些代码示例,可能有用的链接,并显示实现此目的的最佳方法? 问题答案: 这是使用M

  • 问题内容: 我对Java单元测试非常陌生,听说Mockito框架对于测试非常有用。 我已经开发了一个REST Server(CRUD方法),现在我想对其进行测试,但是我不知道如何? 我什至不知道该测试程序应该如何开始。我的服务器应该在本地主机上运行,​​然后在该URL上进行调用(例如,本地主机:8888)? 这是我到目前为止尝试过的方法,但是我很确定这不是正确的方法。 这是方法的代码。 在此测试用

  • 问题内容: 我只想在不引导Angular的情况下测试服务。 我看了一些例子和教程,但是我什么也不会去。 我只有三个文件: myService.js:在这里定义AngularJS服务 test_myService.js:在这里定义服务的Jasmine测试。 specRunner.html:一个具有常规茉莉花配置的HTML文件,在其中导入了前两个其他文件以及茉莉花,Angularjs和angular-

  • 我有一个服务器,用Java编写的,那是我的应用程序,我想在上面运行一些测试。我正在使用gradle来管理依赖项和构建任务等,所以我也想在这方面使用它。我需要启动服务器,然后运行我的单元测试,这会对它发出一堆HTTP请求,然后在测试完成后,理想情况下甚至关闭服务器。所以我尝试在build.gradle中添加(jettyRunWar是运行服务器的工具),但我想这太简单了,因为从不从jettyRunWa