当前位置: 首页 > 知识库问答 >
问题:

EasyMock是否应仅用于模拟外部服务?

公冶安怡
2023-03-14

我有一个关于在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作为其在同一项目中的一部分准备测试数据,并将mock addressService作为其依赖项目的一部分,我们可能对其行为和表结构不太了解

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

模拟所有服务,无论其位于同一项目或依赖项项目的一部分中

缺点:更多地模拟相关代码,而不是实际测试相关代码,使其难以维护并损害易读性。

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

你能不能给我一些建议,说明哪种方法更好,以及为什么要考虑我为这两种方法提供的论点??

共有1个答案

屠钊
2023-03-14

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

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

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

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

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

 类似资料:
  • 我有以下场景: 我想在测试中覆盖公共方法methodA()的catch块。我不想更改私有方法的可见性。是否有任何方法可以使用EasyMock实现私有方法的部分模拟?或者有没有办法改变Junit类中私有方法的行为,以便在不使用mocking的情况下抛出异常? 提前谢谢。

  • 我有几个类遵循“模板方法”模式。抽象类A,具体扩展类B和C,如下所示: 我想编写一个测试来验证当getData()抛出某个Exception时是否抛出其他Exception。我真的希望避免模拟强制getData()抛出所需的所有复杂依赖关系。我不关心getData()如何抛出,我只想让它抛出。所以我想我要的是部分模拟。这就是我所拥有的: 这个测试在我看来很好,但当我运行它时,我得到了这样的结果:

  • 我尝试从以下方法创建单元测试,但我找不到一个解决方案来模拟每个方法内的调用,请您帮助我使用EasyMock为这些方法创建JUnit Test: 提前感谢

  • 我正在尝试为以下类编写单元测试: 还有一些其他方法,但这个设置代码是与我的问题相关的。在单元测试中,我想模拟(使用EasyMock)对象以及它将返回的和对象: 当我尝试用JUnit运行它时,我得到以下错误: 在上没有我可以看到的公共变量。我是EasyMock的新手,所以我想我的问题是:对于我应该告诉我的mock返回什么,以及如何告诉它这样做?我根本不知道为什么设置代码会被调用,所以这是另一个谜。更

  • 假设应用程序依赖于外部服务器上的REST服务,http://otherserver.com.为了测试,我想在JUnit环境中模拟外部rest调用(通过Wiremck)。启动单独的服务器会消耗时间,而且不容易。使用Wiremck规则看起来是正确的方向。创建模拟控制器并不是一种优雅的方式,因为Wiremck是可用的。 例如get(" http://other server . com/service

  • 问题内容: 是否可以使用EaskMock模拟具体的类?如果是这样,我该怎么办? 问题答案: 请参阅EasyMock类扩展文档,并从SourceForge项目下载它。但是,您不能模拟最终方法。 编辑:如注释中所述,这是EasyMock v3及更高版本的一部分。