首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于测试Spring应用程序的Java模拟数据库

用于测试Spring应用程序的Java模拟数据库
EN

Stack Overflow用户
提问于 2015-12-28 06:34:18
回答 2查看 1K关注 0票数 3

我已经做了一个简单的学习准备申请,我想写一些单元/内嵌测试。我读到了一些关于我可以模拟数据库实例来创建新的测试数据库的信息。我会复制一个写的代码。我希望有人能给我讲解如何模拟数据库。

代码语言:javascript
复制
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);
    }

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

EN

回答 2

Stack Overflow用户

发布于 2015-12-28 08:05:44

通常,您有三种选择:

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

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

使用#1,您的测试将跳过向数据库进行身份验证和查找数据的中间步骤。这就留下了代码的一部分未测试,正如他们所说的,“细节就是魔鬼”。当人们在尝试部署时模仿DAO时,经常会遇到这样的问题。

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

使用#3,您可以避免#1和#2的所有问题,但然后您必须连接所有Docker的东西。(我是doing this right now,我也有问题)。不过,这样做的好处是,像#2一样,您可以一次设置所有测试数据,并确保您选择的生产数据库将与您的单元测试完全相同。

在你的情况下,我会选择#2,因为这个应用程序是为了学习目的。是的,我知道这是一个冗长的答案,但随着经验的积累,您可能会想知道如何“向上扩展”。

票数 3
EN

Stack Overflow用户

发布于 2015-12-28 07:30:26

您可以非常容易地将您的UserOptionsDao实现放在测试包中,并将其设置为UserServiceImpl。这个新的实现可以返回固定的数据集,例如...

这是一个高层次的想法。您可能不希望有很多实现(通常每个测试都不同),所以您应该使用一些模拟框架,如MockitoEasyMock,请查看文档以获取更多详细信息。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34485587

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档