是当前最流行的 单元测试 框架,天然支持静态方法和构造函数的 Mock,到底哪个更好用呢?
当我们写单元测试时,我们往往只想验证我们所写函数的功能,而不是它的依赖项。但是有时候它的依赖项并不可控。
为了把函数的依赖项剥离,我们就需要为此依赖项提供一个替代品。通过这种方式,我们可以强制依赖项返回特定值,抛出异常,或者将比较耗时的方法减少到固定的值。
这种替代品就是 ,它可以帮我们简化测试编码并减少测试执行时间。
不是所有的东西都要被 mock 的。有时候如果 mock 带来的好处并不明显,我们该考虑的是是不是换成集成测试更合理等,而不是强行 mock。
假设我们有这样一个场景:我们对外提供了一个保存 toDo list 的服务,用户每次访问接口的时候传递 toDo 编号及 toDo 详情信息,然后我们调用 ToDoService 来处理逻辑,在实际的处理中我们需要调用 DAO 层来保存数据。
首先我们有一个 ToDo 的实体类。
在 ToDoDao 里面,我们有一个 save 方法,但是我们不需要具体实现它,我们后面的例子会对它进行 mock。
在 ToDoService 里,我们同样实现 save 方法,在 save 方法里会调用 Dao 层的 save 方法。且当我们配置了环境变量为 后,我们默认返回保存失败,不进行保存。我们再提供一个返回 void 的 setCurrentNumbering 方法,后面我们测试会用到。
最后,ToDoController 里将调用 ToDoService 方法。
当前,我们已经有了一些逻辑代码,下面我们分别使用 以及 来对他们进行一个 Mock 测试。
创建和使用 mock,最简单方法是使用 和 注解。 为用于定义字段的类创建一个 mock, 会把创建的 mock 注入到当前带注释的 mock 中。
还有更多的一些注释,比如 ,它可以创建部分 mock(一种在非 mock 的方法中使用正常的实现的 mock)。
为了让我们的 mock 生效,我们还需要在执行测试方法前调用 ,因为这些对于所有的测试用例都需要执行,因此我们一般把它放到 注解的方法中。
的设置方法和 一样简单,只是没有针对部分 mock 的特定注解(实际上也不需要),还有,在我们运行前我们需要在 Maven 的 插件(Maven里执行测试用例的插件)里添加一条 javaagent 配置。
使用 注解可以创建一个 mock 实例。注解可以为该类的每个实例创建 mock。
使用 注解创建测试实例,并且自动注入 mock 的依赖项。
为了验证我们的 mock 在 中没有得到调用,我们需要使用 方法,它接受一个 mock 参数。
为了验证我们的 mock 在 中没有得到调用,我们只需要不指定对该 mock 的期望并执行 。
为了模拟方法调用,我们可以使用 。我们可以为多个调用返回不同的值,只需要在最终的返回结果中添加更多的参数:。
为了验证对 mock 的调用,我们可以使用,我们还可以使用验证对 mock 没有调用过。
为了验证参数,我们可以使用特定值或者使用预定义的匹配器,比如 等。中有很多这种类似的匹配器,我们甚至还可以自定义。
对于 ,我们需要使用三步:记录,回放和验证。
记录需要在一个新的 中指定;回放需要调用测试类的方法来完成;验证需要在一个新的 中完成。
对于 mock 方法的调用,我们可以在 块中使用 完成,如果我们需要对多个调用返回不同的值,我们可以使用 代替 。
为了验证 mock 方法的调用,我们可以使用一个新的 代码块完成,或者我们可以直接使用 来完成对我们之前定义的所有方法的验证。
为了验证参数,我们可以使用特定的值,或者我们前面预定义的值,比如: 或其他更多的类似的值。
我们可以在 后面使用 来模拟异常的抛出。
使用 模拟异常抛出非常简单,我们只需要返回一个 Exception 作为 mock 方法调用的返回来替代正常返回值即可。
我们可以创建一个 mock 来作为方法调用的参数。
在 中,想要为单独一个方法 mock 一个对象,我们可以把该 mock 对象作为参数传递给测试方法。然后,我们可以使用像其他任何 mock 一样的方式进行后续操作。
遗憾的是,Mockito 自己无法 mock 静态方法,如果我们想使用 Mockito mock 静态方法,需要配合 框架一起使用。
使用 JMockit mock 静态方法,需要使用 方法,在 方法的泛型中传入需要 Mock 的类,然后使用 注解重写它的静态方法,以返回我们期望的值。
在本篇文章中,我们分别对 以及 的使用做了说明,它们各有优劣。 对于不同类型的测试,它的模式基本一致,因此比较易用。但是因为 是 Java 社区使用最广泛的 mock 框架,且 默认集成并支持 ,建议我们直接使用 。
到此这篇jmockito mock静态方法(mockup静态方法)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!标题:Java Mock 哪家强?Mocktio VS JMockit
作者:末日没有进行曲
链接:link
时间:2021-05-22
声明:本博客所有文章均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/cjjbc/26346.html