单元测试——隔离神器:mockito
mockito,一个让人着迷的单元测试隔离框架。对比了easymock,jmock,jmockito,最终选择了它。
为什么用他
- 接口语法简洁、自然。写起来像在说话,很舒服。
- 文档更完整。让学习曲线更简单。
- 可以进行参数化。在很多情况下,不想关心具体的参数是什么。
- mock的思路更舒服。废弃了陈旧的“录制——重放”的方法,使用的“期望——执行——断言”更自然的方法。
他能解决什么问题
- 可以mock接口。
- 可以破除不可控制的依赖。主要体现在:数据库、文件系统、http(
特别是在和第三方接口对接时
)等。 - 模拟异常。
使用场景
mock接口
Comparable c = mock(Comparable.class);
when(c.compareTo("Test")).thenReturn(1);
assertEquals(1, c.compareTo("Test"));
不关注参数
Comparable c = mock(Comparable.class);
//一旦使用anyXxx()系列,所有的方法参数都必须`全部`使用anyXxx()。
when(c.compareTo(anyString())).thenReturn(1);
assertEquals(1, c.compareTo("Test"));
破除不可控制的依赖
HttpServletRequest successRequest =mock(HttpServletRequest.class);
when(successRequest.getAttribute("status")).thenReturn("200");
OrderEntity order = finish(successRequest);
assertTrue(order.isOk());
模拟异常
OutputStream osMock = mock(OutputStream.class);
OutputStreamWriter osw = new OutputStreamWriter(osMock);
/*
* 因为close()方法的返回值是void,所以只能用这只格式
* 如果返回值不是void,也可以使用when(someMethod()).thenThrow(new Exception());
*/
doThrow(IOException.class).when(osMock).close();
osw.close();
更简洁的mock
通过注解Mock
@Mock
private Iterator i;
@BeforeClass
public void init() {
//这个是必须的。
MockitoAnnotations.initMocks(this);
}
@Test
public void annotationMock() {
when(i.next()).thenReturn(1);
assertEquals(1, i.next());
}
限制
对于final类、匿名类和Java的基本类型是无法进行mock。不过可以使用powerMock扩展。但是正常情况下是不需要的,除非对历史代码的单元测试
参考资源
【【【版权所有,转载请注明原文链接。】】】
文中有不妥或者错误的地方还望指出,以免误人子弟。如果觉得本文对你有所帮助不妨【推荐】一下!如果你有更好的建议,可以给我留言讨论,共同进步!
再次感谢您耐心的读完本篇文章。
【【【我们所浪费的今天,是昨天死去的人奢望的明天;我们所厌恶的现在,是未来的自己回不去的曾经】】】