单元测试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

 

posted @ 2016-11-08 22:28  自行车上的程序员  阅读(1361)  评论(0编辑  收藏  举报