后来发现用 JMockit 来 mock 异常根本没有之前文中描述的那么复杂,其实还是在那个 result 上,给它赋个异常实例就轻而易举的解决了,只需如此

 new Expectations(MyService.class, ExternalService.class) {{ExternalService.fetchData();result =  new NetworkException("No IPAddress ");}};

原文可不用看下去了。


做过几篇 JMockit 使用 Expectations 来 Mock 方法,私有方法,私有属性的的日志,今天工作上突然有个需求是要 Mock 异常。现在再也不能为了跑个单元测试而去拔下网线了,也不该人为的去制造其他混乱来测试。开始是想能不能用 Expectations 来 Mock 异常,尚未发现相关的属性可以设置,没有类似 result 那样的属性,比如想像中有个 exception/throwable 属性:

 new Expectations(MyService.class, ExternalService.class) {{ExternalService.fetchData();throwable =  new NetworkException("No IPAddress ");}};

可是没有 throwable 个属性,至少我还不知道如何用 Expectations 来 Mock 异常,此路不通,所以只得另辟溪径。我们可以直接 new MockUp 来创建类,这比创建一个 MockClass 来得轻量级些。

下面是一个完整例子,由四个类构成,今次列出

1. 要抛出的异常类 NetworkException.java

1
2
3
4
5
6
7
package cc.unmi;
public class NetworkException extends RuntimeException {
     public NetworkException(String message) {
         super (message);
     }
}

2. 被测试类 MyService.java

1
2
3
4
5
6
7
package cc.unmi;
public class MyService {
     public static String fetchData(String name) {
         return ExternalService.fetchByHttp(name);
     }
}

调用 ExternalService.fetchByHttp() 方法,我们的测试用例将要 Mock 住这个方法,并抛出 NetworkException 异常。

3. 外部类,待 Mock 的 ExternalService.java

本文原始链接 http://unmi.cc/jmockit-how-to-mock-excepction/, 来自 隔叶黄莺 Unmi Blog
01
02
03
04
05
06
07
08
09
10
11
12
13
package cc.unmi;
public class ExternalService {
     public static String fetchByHttp(String name) {
         String result = null ;
         try {
             // do something
         } catch (Exception ex) {
             throw new NetworkException(ex.getMessage());
         }
         return result;
     }
}

这是个示例方法,就上面的代码正常执行时肯定不会抛出 NetworkException 异常。我们假定在 //do something 的代码可能会抛出 NetworkException 异常,但我们可以在 Mock 方法中立即呈现出这个异常来。

4. 测试类 MyService.java,并完成异常的 Mock

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package cc.unmi;
import mockit.Mock;
import mockit.MockUp;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
public class MyServiceTest {
     @Rule
     public ExpectedException expectedEx = ExpectedException.none();
     @Test
     public void testFetchData() {
         new MockUp<ExternalService>() {
             @Mock
             public String fetchByHttp(String name) {
                 throw new NetworkException( "No IPAddress" );
             }
         };
         expectedEx.expect(NetworkException. class );
         expectedEx.expectMessage( "No IPAddress" );
         MyService.fetchData( "Yanbin" );
     }
}

这里用 new MockUp<>(){@Mock...} 的方式来 Mock 方法,我们也可以用 @MockClass..@Mock 的方式来创建 Mock 类/方法,但要笨重些。目前我们项目中基本摒弃了用 @MockClass 创建外部 Mock 类的做法,因为一般 Mock 类一般是与某一个测试方法紧密联系着的。

也要注意到 fetchByHttp() 本是个静态方法,但此处不能写成 public String static fetchByHttp(), 但去掉 static 也不会影响到 Mock 的效果。

JUnit 关于异常的测试可以参考 JUnit 4 如何正确测试异常。

测试运行成功,能够断言到所期待的异常类型和消息。

下面为演示 Mock 异常的正确而有效性,故意把 expectedEx.epectMessage("No IPAddress") 改成 expectedEx.epectMessage("NoNo IPAddress"),这样 JUnit  更能爆出有助于理解的错误信息来

上面的错误信息告诉我们

第一个断言 expectedEx.expect(NetworkException.class) 是成功的
期待错误消息 NoNo IPAddress,但得到的是 No IPAddress,这正好从反面说明了我们 Mock 异常是成功的。

JMockit 如何 mock 异常相关推荐

  1. jmockit抛NullPointer异常,initialize failed异常

    使用jmockit进行mock测试: 1. @Mocked 声明mock的属性 2. new Expectations中声明mock的方法和mock返回值. 3. Deencapsulation 将m ...

  2. 单元测试 - mock异常

    单元测试 - mock异常 参考文章: (1)单元测试 - mock异常 (2)https://www.cnblogs.com/jylsgup/p/11154111.html (3)https://w ...

  3. 使用 JMockit 来 mock 构造函数

    Java 测试的 Mock 框架以前是用 JMockit, 最近用了一段时间的 Mockito, 除了它流畅的书写方式,经常这也 Mock 不了,那也 Mock 不了,需要迁就于测试来调整实现代码,使 ...

  4. Jmockit 静态方法mock

    类中存在刷新.初始化等静态方法时,编写单元测试案例. 示例 被测试类: public class MethodClass{public static void refresh(){......init ...

  5. Java也能做爬虫了?我爬取并下载了酷狗TOP500的歌曲!

    点击"开发者技术前线",选择"星标????" 在看|星标|留言,  真爱 作者:后山悟道人   链接:my.oschina.net/gllfeixiang/bl ...

  6. jmockit 创建异常

    原文可不用看下去了. 做过几篇 JMockit 使用 Expectations 来 Mock 方法,私有方法,私有属性的的日志,今天工作上突然有个需求是要 Mock 异常.现在再也不能为了跑个单元测试 ...

  7. Mock工具Jmockit使用介绍

    Mock工具Jmockit使用介绍 在写单元测试的过程中我们会发现需要测试的类有很多依赖,这些依赖的类或者资源又会有依赖,导致在单元测试代码里无法完成构建,我们应对的方法是Mock.简单的说就是模拟这 ...

  8. Java Mock 哪家强?Mocktio VS JMockit

    Mockito 是当前最流行的 Java 单元测试 Mock 框架,JMockit天然支持静态方法和构造函数的 Mock,到底哪个更好用呢? Mock 介绍 为什么要使用 mock 当我们写单元测试时 ...

  9. JMockit Mock 私有方法和私有属性

    JMockit Mock 私有方法和私有属性 时间 2014-02-03 15:02:39   隔叶黄莺Unmi Blog 原文  http://unmi.cc/jmockit-mock-privat ...

最新文章

  1. Linux网站架构系列之Apache----进阶篇
  2. Medusa(美杜莎)和Hydra(九头蛇)快速入门手册:01
  3. Objective-C学习之解析XML
  4. Spring 3整合Quartz 2实现定时任务(转)
  5. loss低但精确度低_低光照图像增强网络-RetinexNet(model.py解析【2】)
  6. 酷狗音乐linux版_让父母也爱上音乐 酷狗音乐大字版成中老年人新宠
  7. C/C++语法知识:typedef struct 用法详解
  8. mysql if没用_关于MySql中使用IFNULL()函数失效的问题。
  9. QPainter详解
  10. 51单片机——舵机的原理及应用
  11. 【黑马程序员】新的开始
  12. linux安装系统时安装多路径包,红帽子linux安装配置多路径
  13. 算法题目:小白上楼梯
  14. 如何将微商相册上的所有图片和小视频快速下载和保存
  15. 学习笔记 - 大数据导论
  16. pr图形模板预设怎么使用_PR怎样安装动态图形模板?怎样调用Mogrt预设?Premiere导入MOGRTs预设完整教程...
  17. pro缺点和不足 一加7t_一加7T与OPPO Reno Ace 各有优势与缺点
  18. 氢os android系统耗电,安卓用久了会卡是定制系统惹的祸?氢OS:这锅我不背!
  19. 分布式 PostgreSQL 集群(Citus)官方示例 - 多租户应用程序实战
  20. Java中将图片转为GIF(实用)

热门文章

  1. 从图像中提取特定颜色区域。
  2. 【若泽大数据001】Linux基础知识汇总
  3. ISCC web题复现
  4. STM32——I2S简介硬件连接
  5. 西南科技大学数据库实验一
  6. 一到十的英文单词,一十二个月份的英文单词,四季的英文单词,第一,第二第三的英文单词...
  7. SCC(四):Palette mode
  8. 精通Web Analytics 2.0 (13) 第十一章:变身分析忍者的指导原则
  9. 数据库系统——2.1、概念结构设计之概念模型(1)
  10. 满分回答教你如何应对面试中项目经验这一难关