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
@Mockprivate Iterator i;@BeforeClasspublic void init() { //这个是必须的。 MockitoAnnotations.initMocks(this);}@Testpublic void annotationMock() { when(i.next()).thenReturn(1); assertEquals(1, i.next());}
限制
对于final类、匿名类和Java的基本类型是无法进行mock。不过可以使用powerMock扩展。但是正常情况下是不需要的,除非对历史代码的单元测试