Mock测试框架(Mockito为例)

  在做单元测试的时候,有的时候用到的一些类,我们构造起来不是那么容易,比如HttpRequest,或者说某个Service依赖到了某个Dao,想构造service还得先构造dao,这些外部对象构造起来比较麻烦。 所以出现了Mock! 我们可以用 Mock 工具来模拟这些外部对象,来完成我们的单元测试。

  实现Mock技术的优秀开源框架有很多,下面以Mockito为例,用几个简单例子来介绍Mock工具的基本使用:

1.Mockito的第一个示例

 1 @Test
 2     public void simpleTest(){
 3
 4         //创建mock对象,参数可以是类,也可以是接口
 5         List<String> list = Mockito.mock(List.class);
 6
 7         //设置方法的预期返回值 (如果list.get(0) 被调用 ,调用之后返回 helloworld)
 8         //当然前提是要创建了Mock对象,如这里就是创建了跟 List相关的 Mock对象
 9         //这里还看不出什么作用,因为Mock 还看不出来,List很容易就能创建
10         //假如是一个很复杂的对象,构造这样一个对象很有难度,使用Mock就很方便了,我们不用去一步一步填充它的属性去构造,
11         //只需要Mock 一下,就可以拿到这个对象,去测试它的方法,(当然,如果方法有参数我们是需要传递的,像get(0))
12         Mockito.when(list.get(0)).thenReturn("helloworld");
13         //list.get(0)的调用就会返回 helloworld
14         String result = list.get(0);
15         System.out.println(result);
16
17         //验证方法调用(是否调用了get(0))
18         Mockito.verify(list).get(0);
19
20         Assert.assertEquals("helloworld", result);
21     }  
 1 @Test
 2 public void testMockMethod() {
 3     Class1Mocked obj=mock(Class1Mocked.class);①
 4
 5     when(obj.hello("z3")).thenReturn("hello l4");②
 6
 7     String actual=obj.hello("z3");③
 8     assertEquals("hello l4",actual);
 9
10     verify(obj).hello("z3");④
11     //verify(obj,times(1)).hello("z3"); //可以加参数验证次数
12 }

  2.验证顺序

 1  @Test
 2     public void testMockMethodInOrder() {
 3         Class1Mocked objOther = Mockito.mock(Class1Mocked.class);
 4         Class1Mocked objCn = Mockito.mock(Class1Mocked.class);
 5
 6         Mockito.when(objOther.hello("z3")).thenReturn("hello l4");
 7         Mockito.when(objCn.hello("z3")).thenReturn("hello 张三");
 8
 9         String other = objOther.hello("z3");  //这里决定了 objOther在先
10         Assert.assertEquals("hello l4", other);
11         String cn = objCn.hello("z3");          //这里决定了 objCn在后
12         Assert.assertEquals("hello 张三", cn);
13
14         InOrder inOrder = Mockito.inOrder(objOther, objCn); //此行并不决定顺序,下面的两行才开始验证顺序
15         inOrder.verify(objOther).hello("z3");
16         inOrder.verify(objCn).hello("z3");
17     }

  3.非局部模拟

 1 // 非局部模拟(只能通过When().thenReturn() 来指定函数的返回类型,但是是调用不了 模拟出来的的类的方法的)
 2     @Test
 3     public void testSkipExpect() {
 4         Class1Mocked obj = Mockito.mock(Class1Mocked.class);
 5
 6         //如:正常如果hello方法被调用,应该返回z3,但这里返回的null ,说明该方法是没有被调用的
 7         //因为我们模拟出来的是非局部变量
 8         Assert.assertEquals(null, obj.hello("z3"));
 9         //show方法也是一样,show方法如果执行应该打印一句话,但是obj并不能执行show方法
10         obj.show();
11
12         Mockito.verify(obj).hello("z3");
13         Mockito.verify(obj).show();
14     }

  4.局部模拟

 1 //局部模拟--spy()方式
 2     @Test
 3     public void testSpy() {
 4         Class1Mocked obj = Mockito.spy(new Class1Mocked());
 5
 6         Mockito.doNothing().when(obj).show();  //有了这行,show方法被执行就不会有任何操作
 7
 8         Assert.assertEquals("z3",obj.hello("z3"));
 9         obj.show();
10
11         Mockito.verify(obj).hello("z3");
12         Mockito.verify(obj).show();
13     }

  5.陷阱

 1 //值得注意的陷阱
 2     @Test
 3     public void testSpy2() {
 4         Class1Mocked obj = Mockito.spy(new Class1Mocked());
 5         //即使使用的是when thenReturn,但是仍然会执行方法里面的内容
 6         Mockito.when(obj.hello("z3")).thenReturn("hello l4");
 7
 8         Assert.assertEquals("hello l4",obj.hello("z3"));
 9
10         Mockito.verify(obj).hello("z3");
11     }
 1 //如果既想使用局部模拟,又不想调用到方法里面的内容
 2     @Test
 3     public void testSpy3() {
 4         Class1Mocked obj = Mockito.spy(new Class1Mocked());
 5
 6         Mockito.doReturn("hello l4").when(obj).hello("z3");
 7
 8         Assert.assertEquals("hello l4",obj.hello("z3"));
 9
10         Mockito.verify(obj).hello("z3");
11     }

参考博文:java的mock测试框架

时间: 2024-08-13 12:06:29

Mock测试框架(Mockito为例)的相关文章

mock测试框架Mockito

无论是敏捷开发.持续交付,还是测试驱动开发(TDD)都把单元测试作为实现的基石.随着这些先进的编程开发模式日益深入人心,单元测试如今显得越来越重要了.在敏捷开发.持续交付中要求单元测试一定要快(不能访问实际的文件系统或数据库),而TDD经常会碰到协同模块尚未开发的情况,而mock技术正是解决这些问题的灵丹妙药. mock技术的目的和作用是模拟一些在应用中不容易构造或者比较复杂的对象,从而把测试与测试边界以外的对象隔离开. 我们可以自己编写自定义的Mock对象实现mock技术,但是编写自定义的Mo

java的mock测试框架

无论是敏捷开发.持续交付,还是测试驱动开发(TDD)都把单元测试作为实现的基石.随着这些先进的编程开发模式日益深入人心,单元测试如今显得越来越重要了.在敏捷开发.持续交付中要求单元测试一定要快(不能访问实际的文件系统或数据库),而TDD经常会碰到协同模块尚未开发的情况,而mock技术正是解决这些问题的灵丹妙药. mock技术的目的和作用是模拟一些在应用中不容易构造或者比较复杂的对象,从而把测试与测试边界以外的对象隔离开. 我们可以自己编写自定义的Mock对象实现mock技术,但是编写自定义的Mo

Mock测试框架

一.前言 使用Mock框架进行单元测试,能够使用当前系统已经开发的接口方法模拟数据.(未写完,慢慢完善) 二.例子 1.引用Moq 2.定义一个接口和方法作为测试 public interface IAnimal { //创造动物,返回是否创造成功 bool CreateAnimal(string name); //方法参数中有输出参数 bool AnimalDance(string name, out string msg); string Eat(string food); int GetC

【翻译】Java使用Mockito进行Mock测试

我们所有人在编写单元测试的时候面临的巨大挑战是模块对其他组件的依赖.同时花费大量的时间和精力去配置依赖的组件环境是一件出力不讨好的事情.使用Mock是一种有效地方式替代其他组件用来继续我们的单元测试构建过程. 接下来我将会展示一个使用mock技术的实例.这里我有一个数据访问层(简称DAL),建立一个类,提供应用程序访问和修改数据库中数据的基本API.接着我会测试这个DAL实例,但并不真正连接数据库.使用DAL类的目的是帮助我们隔离应用程序代码和数据显示层. 让我们通过下面的命令行创建一个java

使用强大的 Mockito 测试框架来测试你的代码

原文链接 : Unit tests with Mockito - Tutorial 译文出自 : 掘金翻译计划 译者 : edvardhua 校对者: hackerkevin, futureshine 这篇教程介绍了如何使用 Mockito 框架来给软件写测试用例 1. 预备知识 如果需要往下学习,你需要先理解 Junit 框架中的单元测试. 如果你不熟悉 JUnit,请查看下面的教程: www.vogella.com/tutorials/J- 2. 使用mock对象来进行测试 2.1. 单元测

强大的Mockito测试框架(转)

1.自动生成Mock类在需要Mock的属性上标记@Mock注解,然后@RunWith中配置Mockito的TestRunner或者在setUp()方法中显示调用MockitoAnnotations.initMocks(this);生成Mock类即可. 2.自动注入Mock类到被测试类只要在被测试类上标记@InjectMocks,Mockito就会自动将标记@Mock.@Spy等注解的属性值注入到被测试类中 import static org.mockito.Mockito.when; impor

Mockito-部分mock测试使用

什么是类的部分mock(partial mock)?A:部分mock是说一个类的方法有些是实际调用,有些是使用mockito的stubbing(桩实现). 为什么需要部分mock? A:当需要测试一个组合方法(一个方法需要其它多个方法协作)的时候,某个叶子方法(只供别人调用,自己不依赖其它反复)已经被测试过,我们其实不需要再次测试这个叶子方法,so,让叶子打桩实现返回结果,上层方法实际调用并测试. mockito实现部分mock的两种方式:spy和callRealMethod() spy实现:

python nose测试框架全面介绍十---用例的跳过

又来写nose了,这次主要介绍nose中的用例跳过应用,之前也有介绍,见python nose测试框架全面介绍四,但介绍的不详细.下面详细解析下 nose自带的SkipTest 先看看nose自带的SkipTest典型应用  应用一: ''' @auth:hu ''' from nose.plugins.skip import SkipTest @attr(mode=1) def test_learn_1(): raise SkipTest 但这种SkipTest在实际的日志中没有显示Skip关

Robot Framework测试框架用例脚本设计方法

Robot Framework介绍 Robot Framework是一个通用的关键字驱动自动化测试框架.测试用例以HTML,纯文本或TSV(制表符分隔的一系列值)文件存储.通过测试库中实现的关键字驱动被测软件.    Robot Framework灵活且易于扩展.它非常适合测试有不同接口的复杂软件:用户接口.命令行,Web服务,专有的编程接口等. Robot Framework是开源软件,通用的测试库源码安装包和文档等可通过http://robotframework.org获取.Robot Fr