前面一篇简单了介绍了测试桩Stub的概念和举例,和测试桩同级还有一个叫驱动桩,这些都属于TDD技术,也就是测试驱动开发的简称。今天来介绍TDD里面的一个测试技术,叫Mock,就是模拟的意思。现在Mock技术已经在单元测试,集成测试和接口测试,性能测试都能看到。我们这边介绍Java语言中基于Junit的单元测试的mock, 有一个jar包叫JMock。
1.Jmock
搜先,单词Mock(和mark发音是一样,别读moke),J就是Java语言了。这个工具的官方网站是http://jmock.org
官方文档教程是http://jmock.org/cookbook.html
本文只是一个小练习,学习了并不表示会用Jmock,还是需要花时间去详细了解Jmock技术,例如看上面的文档。
2.Jmock安装
在项目的pom.xml添加以下依赖
<dependencies>
<dependency>
<groupId>org.jmock</groupId>
<artifactId>jmock</artifactId>
<version>2.12.0</version>
<scope>test</scope>
</dependency>
</dependencies>
3.用例练习
还是前面我们Stub这个项目,我们这里不使用Stub,而是通过Mock出来一个虚拟的Notifier对象,下面是测试用例。
private TrackingService ts;
@Test
public void whenGoalIsMetHistoryIsUpdate() throws InvalidGoalException {
Mockery context = new Mockery();
final Notifier mockNotifier = context.mock(Notifier.class);
ts = new TrackingService(mockNotifier);
context.checking(new Expectations() {{
oneOf (mockNotifier).send("goal met");
will(returnValue(true));
}});
ts.setGoal(5);
ts.addProtein(6);
// 这种条件触发了Notifier 发送消息功能
HistoryItem result = ts.getHistory().get(1); //取第二个数据
assertEquals("send: goal met", result.getOperation());
}
这个用例是运行成功,上面代码大致意思是先创建一个Mock对象context,然后mock出来一个Notifier类型对象,checking是检查的意思,新建一组期望的行为或者动作,这些行为都是mock出来,也就是虚拟的。然后下面代码得以继续运行下去。
总结来说:Mock技术要比Stub技术更加使用广泛一点,这个你从搜索资料就可以看得出来。Mock技术不关在单元测试使用,还有在实际开发,接口测试开发中也使用mock技术。
关于Junit的扩展部分就写到这里,其实我博客之前Java+Selenium写自动化测试用例,是采用TestNG框架,JUnit也是可以做到,从目前来看,Junit可能稍微差一点就在于测试报告这块,你看看单元测试中代码覆盖率的html报告,简直没法看。如果用Junit来运行selenium来做测试,报告这块,我不知道有什么好插件可以支持。
如果后期需要更新这个系列,可能会更新如何使用SonarQube,和在Jenkins上做持续集成这块,毕竟SonarQube是一个支持多语言的静态代码扫描工具,这个代码扫描还是属于单元测试和代码覆盖率这块的范畴。