1

我对在 Quarkus 中执行单元测试的最佳方法有一些疑问。

一种选择是使用模拟,但我有一种感觉,使用模拟我只是“让”测试覆盖插件“开心”,但实际上我没有用这种方法测试任何东西。

另一种选择是使用真实的数据库,如嵌入式 H2 数据库,但为此,我需要按顺序放置单元测试(插入、获取、更新、删除),有时我需要从另一个测试中插入的 ID 来执行例如删除操作。有一些复杂的实体会给插入或删除带来一些困难。因此,使用这种方法,我将失去单元测试的概念,因为我将失去测试的相互依赖性。

有人对这种情况有建议吗?额外信息:我正在使用liquidbase,panache entity,junity。

4

1 回答 1

2

看起来您正在寻找集成测试。我可能会选择下一个选项:

  1. 根据数据库类型,您可以使用内存中的 h2,也可以使用testcontainers进行外部服务。
  2. 有针对一般数据的 sql 测试启动脚本,针对小型测试用例直接插入数据。
  3. 使用http://rest-assured.io/之类的工具(通常包含在初始设置中)进行真正的 api 调用

如果你真的想要单元测试,在这种情况下,90% 的时间你不需要数据库来测试功能。由于解耦,您可能将控制器(资源)与服务分开。所以在单元测试的情况下,我可能会选择:

  1. 如上所述,从网络层分离逻辑,因此任何处理和包装输出以满足客户端的请求都在逻辑层之外。如果可能,将逻辑本身拆分为更小的块,这将消除您对复杂数据的主要担忧
  2. 对于任何依赖的依赖项,要么使用测试 bean 覆盖它们,要么使用 Mockito 模拟它们。这对于持久性尤其重要,您需要模拟或伪造任何与数据库的连接,您不需要测试这部分,因为它通常由库处理。
  3. 您可以从文件中读取 JSON 对象以获取真正复杂的实体
  4. 如果您确实需要持久性,请查看此答案中的第一点。

所以感觉就像您想检查您的服务是否在更高级别上正确完成工作,这可能不是单元测试,希望答案会有所帮助

于 2020-04-30T06:54:13.947 回答