如何在 Spring Boot 中使用 testng 测试数据库调用

Posted

技术标签:

【中文标题】如何在 Spring Boot 中使用 testng 测试数据库调用【英文标题】:How to test database calls with testng in spring boot 【发布时间】:2015-02-24 08:34:41 【问题描述】:

我在 Spring Boot 中创建了小型 Web 应用程序。我是 TestNG 的新手。我正在尝试使用调用 dao 进行数据库操作的 testng 测试我的服务。我正在尝试使用内存数据库HSQL

以下是我的UserService

@Service
class UserServiceImpl implements UserService

    public void save(User user)
     
        userDao.save(user);
    

    public User update(user)
    
        userDao.update(user);
    

以下是我的UserTest 课程

@Test
class UserTest

    ?

使用 TestNGDataProvider 使用 HSQL 来测试 UserService 中的 saveupdate 方法的好方法是什么?如果需要有关问题的更多信息,请告诉我;)

您的回复将不胜感激!

【问题讨论】:

模拟 DAO 怎么样? 请您详细说明您的答案。 您可以使用 Mockito 之类的框架并为您的 UserDao 创建一个模拟。 【参考方案1】:

如果您只是想测试是否正确调用了 dao,请使用模拟框架(我会选择 Mockito)对其进行模拟,然后验证您的服务是否调用了正确的方法。这更像是“单元”,因为您的测试反映了 dao 和服务的明确分离。

如果您对创建/加载实例等的真实数据库通信感兴趣,您可以使用像 h2 这样的内存数据库并让您的 dao 针对该数据库运行。这更像是一个集成测试,但仍然很有用。

无论哪种方式,您都将设置一个关心数据源和模拟的测试应用程序上下文。

【讨论】:

【参考方案2】:

Acolyte 提供 JDBC 驱动程序和工具,专为此类目的(模拟、测试等)而设计:https://github.com/cchantep/acolyte

它已经在几个开源项目(Anorm、Youtube Vitess,...)中使用,无论是在 vanilla Java 还是使用它的 Scala DSL:

handler = handleStatement.withQueryDetection(...).
  withQueryHandler(/* which result for which query */).
  withUpdateHandler(/* which result for which update */).

// Register prepared handler with expected ID 'my-unique-id'
acolyte.Driver.register("my-unique-id", handler);
// then ...
Connection con = DriverManager.getConnection(jdbcUrl);
// ... Connection |con| is managed through |handler|

注意:我是 Acolyte 的作者。

【讨论】:

以上是关于如何在 Spring Boot 中使用 testng 测试数据库调用的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring Boot 中使用 Spring Security 启用 CORS

如何在 Spring Boot 中使用 Spring Security 配置 CORS? [复制]

如何在Spring Boot 中使用 HandlerMethodArgumentResolver

spring boot 如何使用多线程

如何在 spring-boot 中替换最新的 Jetty 9?

如何在 Spring Boot 中手动新建实例中使用 @Autowired