test mock-02-easymock 入门介绍

拓展阅读

test 之 jmockit-01-overview

jmockit-01-test 之 jmockit 入门使用案例

mockito-01-overview mockito 简介及入门使用

PowerMock

Mock Server

ChaosBlade-01-测试混沌工程平台整体介绍

jvm-sandbox 入门简介

快速开始

翻译自官方:

被测试的类

public class ClassTested {

  private Collaborator listener;

  public void setListener(Collaborator listener) {
    this.listener = listener;
  }

  public void addDocument(String title, String document) {
    listener.documentAdded(title);
  }
}

作为一个善良的人类,你想要测试你的实现。

你甚至可能是TDD(测试驱动开发)的信徒,尚未完成你的实现。你希望首先进行测试!

你的被测试类将依赖于其他类,因此你考虑到你需要一个模拟框架。

幸好你有这个想法。请将 EasyMock 的依赖添加到你的 POM 文件中。

<dependency>
  <groupId>org.easymock</groupId>
  <artifactId>easymock</artifactId>
  <version>5.2.0</version>
  <scope>test</scope>
</dependency>

好的。现在 addDocument 应该执行一些操作,然后通知一个依赖项。

我们称之为 Collaborator

public interface Collaborator {
    void documentAdded(String title);

现在,我要提醒一下。

在这个例子中,我将模拟一个接口。这并不意味着你只能模拟接口。我讨厌没用的接口。

而且你希望我开心。请不要仅仅为了模拟而创建接口。

只需模拟具体的类。谢谢。

所以,我们要确保 addDocument 通过调用带有正确标题参数的 documentAdded 来通知 Collaborator。我们的待办事项清单如下:

  1. 创建模拟对象
  2. 将模拟对象设置给被测试的类
  3. 记录我们期望模拟对象执行的操作
  4. 告诉所有模拟对象我们现在要进行实际测试
  5. 进行测试
  6. 确保所有应该被调用的都已经被调用

接下来是实现代码:

import static org.easymock.EasyMock.*;
import org.easymock.*;
import org.junit.*;

public class ExampleTest extends EasyMockSupport {

    @Rule
    public EasyMockRule rule = new EasyMockRule(this);

    @Mock
    private Collaborator collaborator; // 1

    @TestSubject
    private ClassTested classUnderTest = new ClassTested(); // 2

    @Test
    public void addDocument() {
        collaborator.documentAdded("New Document"); // 3
        replayAll(); // 4
        classUnderTest.addDocument("New Document", "content"); // 5
        verifyAll(); // 6
    }
}

这就是你开始的全部需要。不过有一些建议:

  • 扩展(或委托给)EasyMockSupport 是有用的,但不是强制的。它允许调用 replayAll,而不是 replay(mock1, mock2, ...) 之类的。
  • 模拟对象的注入是在字段上完成的(通过 EasyMockRule),因此你不需要为测试而编写仅用于测试的 setter 方法。
  • 我们正在测试 documentAdded 只调用一次,并接收到确切的参数。对模拟对象的任何其他调用都将导致测试失败。

easymock 和其他的 java mock 框架对比有什么优势吗?

  1. 简单易用: 如其名,EasyMock 被设计成简单易用,入门门槛较低。其清晰的 API 和直观的语法使得编写和理解测试用例更加容易。

  2. 强大的录制和回放功能: EasyMock 提供了明确的录制(Record)和回放(Replay)阶段,使得测试编写变得直观。这有助于清晰定义期望行为,并在测试过程中验证这些期望。

  3. Mocking 接口和类: EasyMock 不仅支持对接口的模拟,还能够模拟具体的类。这在一些场景下非常有用,尤其是在现有代码中需要进行单元测试时。

  4. Matcher 的丰富支持: EasyMock 提供了丰富的匹配器(Matcher),用于灵活匹配方法参数。这使得测试用例更加灵活且易于维护。

  5. Mock 对象的可维护性: EasyMock 允许通过继承 EasyMockSupport 类来简化测试的设置和验证。这有助于减少测试代码的重复和提高可维护性。

  6. 规避不必要的接口: 文档中提到了对不必要的接口的反感,强调了不必为了测试而专门创建接口。这种实用主义的设计哲学可能受到一些开发者的欢迎。
    在这里插入图片描述

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值