gpt4 book ai didi

用于测试 Spring 应用程序的 Java Mock 数据库

转载 作者:行者123 更新时间:2023-11-30 08:06:16 25 4
gpt4 key购买 nike

我已经制作了简单的学习应用程序,我想编写一些单元/集成测试。我阅读了一些关于我可以模拟数据库而不是为测试创建新数据库的信息。我将复制其中一个写的代码。我希望有人能向我解释如何模拟数据库。

public class UserServiceImpl implements UserService {

@Autowired
private UserOptionsDao uod;

@Override
public User getUser(int id) throws Exception {
if (id < 1) {
throw new InvalidParameterException();
}
return uod.getUser(id);
}

@Override
public User changeUserEmail(int id, String email) {
if (id < 1) {
throw new InvalidParameterException();
}

String[] emailParts = email.split("@");
if (emailParts[0].length() < 5) {
throw new InvalidParameterException();
} else if (!emailParts[1].equals("email.com")) {
throw new InvalidParameterException();
}

return uod.changeUserEmail(id, email);
}

上面是我想用模拟数据库测试的代码的一部分。

最佳答案

通常你有三种选择:

  1. 按照@Betlista 的建议模拟 UserOptionsDao 返回的数据,从而创建一个“假的”DAO 对象。
  2. 使用内存数据库,如 HSQLDB在测试开始时创建一个包含模拟数据的数据库,或者
  3. 使用 Docker 容器之类的东西来启动 MySQL 实例等,并用数据填充它,这样您就可以在必要时重新启动它。

这些解决方案都不是完美的。

对于 #1,您的测试将跳过验证数据库和查找数据的中间步骤。这会使您的一部分代码未经测试,正如他们所说,“细节决定成败”。人们在尝试部署时像这样模拟 DAO 时经常会遇到问题。

对于#2,您连接到一个实际的数据库,但您必须确保您在生产代码中使用的是完全相同类型的数据库或兼容的数据库。它还使调试变得很痛苦,因为如果出现问题,您必须暂停测试以查看数据库的内容。

使用#3,您可以避免#1 和#2 的所有问题,但随后您必须连接所有 Docker 组件。 (我是 doing this right now ,我也遇到了问题)。不过,其优势在于,与 #2 一样,您可以一次设置所有测试数据,并确保您选择的生产数据库与单元测试完全相同。

在您的情况下,我会选择 #2,因为该应用程序用于学习目的。是的,我知道这是一个冗长的答案,但随着您获得经验,您可能想知道如何“扩大规模”。

关于用于测试 Spring 应用程序的 Java Mock 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34485587/

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