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

时间:2015-12-27 22:34:18

标签: java spring unit-testing

我已经简单地申请了研究,我想写一些单元/凹版测试。我读了一些关于我可以模拟创建新db for tests的数据库的信息。我将复制写入的代码。我希望有人会解释我如何模拟数据库。

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);
    }

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

2 个答案:

答案 0 :(得分:1)

您可以轻松完成的工作是在测试包中实施UserOptionsDao并将其设置为UserServiceImpl。这个新实现可以返回固定的数据集,例如......

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

答案 1 :(得分:1)

通常,您有三种选择:

  1. 将@ UserOptionsDao返回的数据模拟为@Betlista建议,从而创建一个&#34;假的&#34; DAO对象。
  2. 使用内存数据库(如HSQLDB)在测试开始时使用模拟数据创建数据库,或者
  3. 使用类似Docker容器之类的东西来启动MySQL等实例并用数据填充它,这样你就可以根据需要重新启动它。
  4. 这些解决方案都不是完美的。

    使用#1,您的测试将跳过对数据库进行身份验证和查找数据的中间步骤。这使得你的代码的一部分未经测试,正如他们所说,&#34;魔鬼在细节中。&#34;当人们试图部署DAO时,他们经常会遇到问题。

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

    使用#3,你可以避免#1和#2的所有问题,但是你必须连接所有Docker的东西。 (我doing this right now,我也有问题)。但是,优点是,与#2一样,您可以一次设置所有测试数据,并保证您选择的生产数据库与您的单元测试完全相同。

    在你的情况下,我会选择#2,因为申请是出于学习目的。是的,我知道这是一个冗长的答案,但是当你获得经验时,你可能想知道如何扩大规模。&#34;