【问题标题】:Should EasyMock be used to mock only external services?是否应该使用 EasyMock 仅模拟外部服务?
【发布时间】:2015-09-27 14:45:51
【问题描述】:

我有一个关于在 junits 中使用 EasyMock 的问题。我们已经为junits 配置了一个框架,它使用inmemory derby 数据库和EasyMock 来测试我们的服务项目。我们在内存 derby 中完全使用 dao 层。问题出现在天气上是完全使用 EasyMock 还是在服务层一起使用 EasyMock 和 derby。下面是场景:

    //class under test is in user-service project
    class ServiceClassUnderTest {
             IUserService userService; 
             IAddressService addressService; 

             public Address getUsersAddress(String id) {
                        User user = userService.getUserById(id);
                        // some logic goes here
                        Address address = addressService.getAddresdByUser(user);
                       // some validations goes here
                        return address;
             }
      }

被测类在用户服务项目中,IUserService 接口也是。而 IAddressService 接口位于地址服务项目中,用作用户服务项目中的依赖项。

现在的问题在于一些同事建议的方法改变。

我们过去遵循的方法

在同一个项目中为 userService 准备测试数据,并模拟 addressService 作为依赖项目的一部分,我们可能对它的行为和表结构不太了解

优势:更简洁的方法,因为我们有最少的模拟和测试数据代码在单独的 sql 文件中

建议的方法

模拟所有服务,无论它是在同一个项目中还是在依赖项目的一部分中

缺点:模拟相关代码多于实际测试相关代码,难以维护并影响可读性。


给出的代码示例仅用于解释在实际项目中我们具有更复杂的结构且单个类中有多个服务 bean 的场景。

您能否就哪种方法更好以及为什么要考虑我为这两种方法提供的论点给我您的建议??

【问题讨论】:

  • 大家好,请您就应该遵循的方法给我您的反馈

标签: junit easymock in-memory-database


【解决方案1】:

没有完整的大局,很难确定。假设你真的想要单元测试,我通常会这样做:

  • 仅使用实际 DB 测试对 DB 执行的查询
  • 模拟我测试的班级使用的所有内容。

这个“一切”应该不超过 3 或 4 个依赖项。否则,我会重构,直到我得到可读的东西。

测试代码多于生产代码是正常的。

如果我最终在我的测试方法中有一些琐碎的代码,我只是不测试它。但是,也可以使用测试来记录。所以这是一条模糊的线。

【讨论】:

    猜你喜欢
    • 2013-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多