Java Mock 哪家强?Mocktio VS JMockit

Mockito 是当前最流行的 Java 单元测试 Mock 框架,JMockit天然支持静态方法和构造函数的 Mock,到底哪个更好用呢?

Mock 介绍

为什么要使用 mock

当我们写单元测试时,我们往往只想验证我们所写函数的功能,而不是它的依赖项。但是有时候它的依赖项并不可控。

为了把函数的依赖项剥离,我们就需要为此依赖项提供一个替代品。通过这种方式,我们可以强制依赖项返回特定值,抛出异常,或者将比较耗时的方法减少到固定的值。

这种替代品就是 mock,它可以帮我们简化测试编码并减少测试执行时间。

到底要不要 mock

不是所有的东西都要被 mock 的。有时候如果 mock 带来的好处并不明显,我们该考虑的是是不是换成集成测试更合理等,而不是强行 mock。

测试用例

假设我们有这样一个场景:我们对外提供了一个保存 toDo list 的服务,用户每次访问接口的时候传递 toDo 编号及 toDo 详情信息,然后我们调用 ToDoService 来处理逻辑,在实际的处理中我们需要调用 DAO 层来保存数据。

编码实现

首先我们有一个 ToDo 的实体类。

public class ToDoModel {
    private Long numbering;
    private String toDoDetail;
}

在 ToDoDao 里面,我们有一个 save 方法,但是我们不需要具体实现它,我们后面的例子会对它进行 mock。

public class ToDoDao {
    public int save(ToDoModel toDoModel) {
        return 0;
    }
}

在 ToDoService 里,我们同样实现 save 方法,在 save 方法里会调用 Dao 层的 save 方法。且当我们配置了环境变量STOP_SERVICEtrue 后,我们默认返回保存失败,不进行保存。我们再提供一个返回 void 的 setCurrentNumbering 方法,后面我们测试会用到。

public class ToDoService {
    private ToDoDao toDoDao;
    private long currentNumbering;

    public boolean save(ToDoModel toDoModel) {
        assert toDoModel != null;
        if (Boolean.parseBoolean(Optional.ofNullable(System.getenv("STOP_SERVICE")).orElse("false"))) {
            return false;
        }
        int result = toDoDao.save(toDoModel);
        switch (result) {
	        case 1:
	            return true;
	        default:
	            return false;
        }
    }

    public void setCurrentNumbering(long numbering) {
        if (numbering > 0) {
            this.currentNumbering = numbering;
        }
    }
}

最后,ToDoController 里将调用 ToDoService 方法。

public class ToDoController {
    public ToDoService toDoService;

    public String add(ToDoModel toDoModel) {
        if (toDoModel == null) {
            return "ERROR";
        } else {
            boolean added;
            try {
                added = toDoService.save(toDoModel);
            } catch (Exception e) {
                return "ERROR";
            }

            if (added) {
                toDoService.setCurrentNumbering(toDoModel.getNumbering());
                return "OK";
            } else {
                return "NOT OK";
            }
        }
    }
}

当前,我们已经有了一些逻辑代码,下面我们分别使用 Mockito 以及 JMockit 来对他们进行一个 Mock 测试。

测试设置

Mock

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值