由于公司开发的项目基本上是分布式应用,所以需要在代码中模拟出依赖的服务,先确保自己开发的代码主流程可以跑通,等所依赖的服务发布成功后就可去除模拟的服务,用真实的服务进行再次测试。
Mockito 测试框架
测试步骤
① 使用 mockito 生成 Mock 对象;
② 定义(并非录制) Mock 对象的行为和输出(expectations部分);
③ 调用 Mock 对象方法进行单元测试;
④ 对 Mock 对象的行为进行验证。
常用注解
- @InjectMocks:创建一个实例,其余用@Mock(或@Spy)注解创建的mock将被注入到用该实例中。
- @Mock:创建一个Mock。
注:PowerMock是Mockito上扩展出来的,目的是为了解决EasyMock和Mockito不能解决的问题,比如对static, final, private方法均不能mock。
需要被模拟的类:
public class Class2Mocked { public static int getDouble(int i){ return i*2; } public String getTripleString(int i){ return multiply3(i)+""; } private int multiply3(int i){ return i*3; } }
模拟静态方法:
@Test public void testMockStaticMethod() { mockStatic(Class2Mocked.class); when(Class2Mocked.getDouble(1)).thenReturn(3); int actual = Class2Mocked.getDouble(1); assertEquals(3, actual); verifyStatic(); Class2Mocked.getDouble(1); }
模拟私有方法:
doCallRealMethod方式
@Test public void testMockPrivateMethod() throws Exception { Class2Mocked obj = mock(Class2Mocked.class); when(obj, "multiply3", 1).thenReturn(4); doCallRealMethod().when(obj).getTripleString(1); String actual = obj.getTripleString(1); assertEquals("4", actual); verifyPrivate(obj).invoke("multiply3", 1); }
spy方式
@Test public void testMockPrivateMethod2() throws Exception { Class2Mocked obj = spy(new Class2Mocked()); when(obj, "multiply3", 1).thenReturn(4); String actual = obj.getTripleString(1); assertEquals("4", actual); verifyPrivate(obj).invoke("multiply3", 1); }
具体业务上使用: