单元测试——隔离神器:mockito

mockito,一个让人着迷的单元测试隔离框架。对比了easymock,jmock,jmockito,最终选择了它。

为什么用他

  1. 接口语法简洁、自然。写起来像在说话,很舒服。
  2. 文档更完整。让学习曲线更简单。
  3. 可以进行参数化。在很多情况下,不想关心具体的参数是什么。
  4. mock的思路更舒服。废弃了陈旧的“录制——重放”的方法,使用的“期望——执行——断言”更自然的方法。

他能解决什么问题

  1. 可以mock接口。
  2. 可以破除不可控制的依赖。主要体现在:数据库、文件系统、http(特别是在和第三方接口对接时)等。
  3. 模拟异常。

使用场景

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扩展。但是正常情况下是不需要的,除非对历史代码的单元测试

参考资源

  1. 官方文档
  2. 中文文档
  3. 快速上手
posted @ 2015-11-05 14:53  庄君祥  阅读(2005)  评论(1编辑  收藏  举报