模拟与监控

  1. 使用模拟对象
    1. 其优点包括:代码依赖更少;测试执行速度更快。
    2. 要快速执行测试并专注于单个功能单元,必须使用模拟对象。通过模拟受测方法的外部依赖,开发人员能够专注于手头的任务,而无需花时间建立这些依赖。在小组较大或多个小组协同工作的情况下,这些依赖甚至可能还没有开发出来。另外,不使用模拟对象的情况下,测试的执行速度通常很慢。模拟对象非常适合用于代替数据库、其他产品、服务等。
  2. 为什么使用模拟对象
    1. 对象的结果不确定。例如,每次实例化java.util.Date时,得到的结果都不同,我们无法检查其结果是否符合预期:java.util.Date date = new java.util.Date(); date.getTime();// 这个方法返回的结果是什么呢?
    2. 对象不存在。例如,我们可能创建一个接口并对其进行测试,但测试使用这个接口的代码时,实现这个接口的对象可能还没有编写好。
    3. 对象速度缓慢,需要时间处理。最常见的例子是数据库。我们可能编写了获取所有记录并生成报告的代码,这种操作可能需要几分钟、几小时乃至几天。
    4. 使用模拟对象的原因适用于所有类型的测试,通过模拟可隔离当前方法使用的所有依赖,这让我们能够专注于单个单元,忽略其调用的代码内部工作原理。
  3. 术语
    1. 哑元对象(dummy object)用于替换真正的方法参数;
    2. 测试存根(test stub)用于将实际对象替换为测试特定对象,以便向受测系统提供所需的间接输入;
    3. 测试间谍(test spy)记录受测系统(SUT)向另一个组件发出的间接输出调用,让测试随后能够进行验证;
    4. 模拟对象(mock object)用于将受测系统依赖的对象替换为测试特定对象,以验证SUT是否正确使用;
    5. 伪造对象(fake object)用于将受测系统依赖的组件替换为量级更轻的实现。
  4. 模拟对象
    1. 模拟对象模拟实际对象(通常很复杂)的行为,让我们能够创建对象以替换实现代码中使用的实际对象。模拟对象期望使用指定参数调用指定方法,以返回预期的结果,它预先知道应发生什么情况以及我们期望它做何反应。
  5. mockito
    1. mock():用于创建模拟对象,还可使用when()和given()指定这些模拟对象的行为。
    2. spy():可用于实现部分模拟。除非另有说明,否则间谍对象调用实际方法。与模拟对象一样,对于间谍对象的每个公有或受保护的方法(静态方法除外),都可设置其行为。主要差别在于,mock()创建一个完全伪造的对象,而spy()使用实际对象。
    3. verify():用于检查调用方法时提供的是否是指定参数,这是一种断言
  6. mock对象
    1. MongoCollection mongoCollection = mock(MongoCollection.class);
      1. 根据MongoCollection创建一个模拟对象。鉴于我们已经确定,进行单元测试时应避免直接与数据库通信,而通过模拟这个依赖可达成这个目标。模拟将真实类转换为模拟类,在使用mongoCollection的类看来,它就像一个真实的类。但在幕后,它的所有方法都是shallow,即什么都不做:就像重写了这个类,将其所有方法都改为空:
    2. doReturn(mongoCollection).when(collection) .getMongoCollection();
      1. collection = spy(new TicTacToeCollection());
      2. 每当调用间谍对象collection的方法getMongoCollection时,都应返回模拟对象mongoCollection。换言之,我们让类使用伪造的集合而不是真实集合:
    3. verify(mongoCollection, times(1)).save(bean);
      1. 验证是否正确调用了Jongo库,且只调用了1次:
    4. doThrow(new MongoException(“Bla”)) .when(mongoCollection) .save(any(TicTacToeBean.class));
      1. Mockito方法——doThrow,它类似于doReturn,但在when设置的条件满足时“引发异常”。这个规范在mongoCollection类的方法save被调用时引发MongoException异常,这让我们能够断言方法saveMove在出现异常时返回false。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值