单元测试mock之mockito使用
先来一个简单的例子来感受一下
外部接口类:TestService.java
1 package com.yzl.mock; 2 3 /** 4 * 测试用服务 5 * 6 * @author yangzhilong 7 */ 8 public interface TestService { 9 /** 10 * 11 * 简单的测试服务,实现两个数相加 12 * 13 * @param a 14 * @param b 15 * @return 16 */ 17 public int add(int a, int b); 18 }
正常流程的JUnit单元测试方法类似如下:
1 @Test 2 public void test0(){ 3 //从spring容器里取到该接口的实现类 4 TestService service = new ClassPathXmlApplicationContext("xxx.xml").getBean(TestService.class); 5 int a=2, b=3; 6 int result = service.add(a, b); 7 Assert.assertSame("计算结果预期", 5, result); 8 9 //拿到这个result然后调用其他的业务逻辑 10 }
但是目前该接口的实现类(服务)目前是调用不通的,或者是压根还没做,但是你又不想因为这个接口而影响自己的代码的测试,就可以使用Mockito来模拟接口的调用。
首先引入mockito的jar
1 <dependency> 2 <groupId>org.mockito</groupId> 3 <artifactId>mockito-core</artifactId> 4 <version>2.1.0-RC.1</version> 5 <scope>test</scope> 6 </dependency>
然后编写代码如下:
1 package com.yzl.mock; 2 3 import org.junit.Assert; 4 import org.junit.Test; 5 import org.mockito.Mockito; 6 7 public class MockTest { 8 /* 9 * 使用mockito来模拟测试 10 */ 11 @Test 12 public void test1(){ 13 TestService service = Mockito.mock(TestService.class); 14 int a=2, b=3; 15 //使用mockito模拟接口返回 16 Mockito.when(service.add(a, b)).thenReturn(5); 17 int result = service.add(a, b); 18 System.out.println(a + "+" + b + "=" + result); 19 Assert.assertSame("计算结果预期", 5, service.add(a, b)); 20 //使用result继续做后面的业务 21 } 22 }
上面的代码中Mockito的静态方法可以通过静态Import的形式导入,然后使用里面的静态方法就可以不带类名了,例如:
//非静态import的写法 import org.mockito.Mockito; Mockito.when(service.add(a, b)).thenReturn(5); //静态import的写法 import static org.mockito.Mockito.*; when(service.add(a, b)).thenReturn(5);
运行junit单元测试方法将输出:
2+3=5