测试替身

dummy用于传递,不会真正使用,例如用于填充的方法的参数列表。

Fake有简单实现,但通常被简化,比如在内存数据库,而不是真正的数据库中使用。

Stub是接口或类中部分实现,测试时使用其实例,通常有回应,也可能记录调用信息。

Mock对象是接口或类假实现,定义某些方法的输出。

参考资料:外链网址已屏蔽。

通常首选Mock。

Mock框架让你在运行时创建模拟对象,并定义他们的行为。Python中的unittest、pytest、nose等测试框架mock功能做得相当强大。Java的mock功能较弱,Junit需要借助外部包来mock,mock功能也远不及pytest。Java中常见的mock框架有jMock、EasyMock、Mockito和PowerMock等。

Eclipse ADT安装Mockito的方法:在工程的libs目录中添加dexmaker-1.4.jar、dexmaker-dx-1.2.jar、dexmaker-mockito-1.4.jar、mockito-core-1.10.19.jar. 下载地址参考:

外链网址已屏蔽

外链网址已屏蔽

外链网址已屏蔽

外链网址已屏蔽

非安卓系统的安装:

mockito-core-1.10.19.jar objenesis-2.1.jar

ItellliJ IDEA的安装:File - Project Settings - Modules:

Gradle中的设置如下:

repositories { jcenter() }

dependencies { testCompile "org.mockito:mockito-core:1.+" }

Maven中可以用依赖搞定,在外链网址已屏蔽"org.mockito"和"mockito-core"可以找到对应的POM入口。

Mockito API

Mockito支持用静态mock()创建mock对象。通过静态导入,您可以在指定类的情况下调用静态成员(方法和成员)。verify()方法用于确认模拟的方法已经调用。when(....).thenReturn(....)用来指定条件和对应的返回值。如果指定多个值,会依次返回。然后最后一个指定的值返回。anyString或anyInt实现了类似通配符的功能。

下面例子,我们基于MyClass.java:

packagepany;/*** Created by 80125605 on 2015/11/9.*/

public classMyClass {public int multiply(int x, inty) {//the following is just an example

if (x > 999) {throw new IllegalArgumentException("X should be less than 1000");

}return x /y;

}

}

测试代码MyClassTest.java

packagepany.test;importpany.MyClass;importorg.junit.Test;import static org.mockito.Mockito.*;import static org.junit.Assert.*;import staticorg.junit.Assert.assertEquals;importorg.junit.AfterClass;importorg.junit.BeforeClass;importorg.junit.Test;importjava.util.Iterator;public classMyClassTest {

@Test(expected= IllegalArgumentException.class)public voidtestExceptionIsThrown() {

MyClass tester= newMyClass();

tester.multiply(1000, 5);

}

@Testpublic voidtestMultiply() {

MyClass tester= newMyClass();

assertEquals("10 x 5 must be 50", 500, tester.multiply(10, 5));

}

@Testpublic voidtest1() {//create mock

MyClass test = mock(MyClass.class);//define return value for method getUniqueId()

when(test.multiply(3, 3)).thenReturn(9);//use mock in test....

assertEquals(test.multiply(3,3), 9);

}//Demonstrates the return of multiple values

@Testpublic voidtestMoreThanOneReturnValue() {

Iterator i= mock(Iterator.class);

when(i.next()).thenReturn("Mockito").thenReturn("rocks");

String result=i.next()+" "+i.next();//assert

assertEquals("Mockito rocks", result);

}//this test demonstrates how to return values based on the input

@Testpublic voidtestReturnValueDependentOnMethodParameter() {

Comparable c= mock(Comparable.class);

when(pareTo("Mockito")).thenReturn(1);

when(pareTo("Eclipse")).thenReturn(2);//assert

assertEquals(1, pareTo("Mockito"));

}//this test demonstrates how to return values independent of the input value

@Testpublic voidtestReturnValueInDependentOnMethodParameter2() {

Comparable c= mock(Comparable.class);

when(pareTo(anyInt())).thenReturn(-1);//assert

assertEquals(-1 ,pareTo(9));

}

}

方法testExceptionIsThrown和testMultiply是正常的Junit测试。test1为返回模拟值,testMoreThanOneReturnValue返回2个值,testReturnValueDependentOnMethodParameter根据输入返回值,testReturnValueInDependentOnMethodParameter使用了通配符。另外还可以基于条件mock:

@Testpublic voidtestReturnValueInDependentOnMethodParameter() {

Comparable c= mock(Comparable.class);

when(pareTo(isA(Todo.class))).thenReturn(0);//assert

Todo todo = new Todo(5);

assertEquals(todo ,pareTo(new Todo(1)));

}

doReturn(...).when(...).methodCall的工作方法类似,适用于void方法。doThrow适合返回void的方法的异常处理,不能演示,仅供参考:

import static org.mockito.Mockito.*;import static org.junit.Assert.*;//this test demonstrates how use doThrow

@Test(expected=IOException.class)public voidtestForIOException() {//create an configure mock

OutputStream mockStream = mock(OutputStream.class);

doThrow(newIOException()).when(mockStream).close();//use mock

OutputStreamWriter streamWriter= newOutputStreamWriter(mockStream);

streamWriter.close();

}

下面代码使用verify(),不能演示,仅供参考:

import static org.mockito.Mockito.*;

@Testpublic voidtestVerify() {//create and configure mock

MyClass test = Mockito.mock(MyClass.class);

when(test.getUniqueId()).thenReturn(43);//call method testing on the mock with parameter 12

test.testing(12);

test.getUniqueId();

test.getUniqueId();//now check if method testing was called with the parameter 12

verify(test).testing(Matchers.eq(12));//was the method called twice?

verify(test, times(2)).getUniqueId();//other alternatives for verifiying the number of method calls for a method

verify(mock, never()).someMethod("never called");

verify(mock, atLeastOnce()).someMethod("called at least once");

verify(mock, atLeast(2)).someMethod("called at least twice");

verify(mock, times(5)).someMethod("called five times");

verify(mock, atMost(3)).someMethod("called at most 3 times");

}

参考资料:

外链网址已屏蔽

java junit mock_使用Mockito进行Java的Mock测试相关推荐

  1. Java单元测试之模拟利器-使用PowerMock进行Mock测试

    首页 国产Linux Linux命令 openSUSE ArchLinux Slackware FreeBSD Ubuntu CentOS Fedora Debian PHP教程 在线教程 登录 注册 ...

  2. java junit 异常_JUnit:使用Java 8和Lambda表达式测试异常

    java junit 异常 在JUnit中,有许多方法可以在测试代码中测试异常,包括try-catch idiom JUnit @Rule和catch-exception库. 从Java 8开始,我们 ...

  3. Java Mocking入门—使用Mockito

    我们都会编写单元测试程序,但我们当前所面临的挑战是被测单元可能依赖于其他组件.而对于单元测试配置其他组件,绝对是过枉矫正.相反,我们可以使用Mocks框架代替其他组件,继续进行单元测试. 为了展现如何 ...

  4. mockito java_使用Mockito在Java中进行模拟入门

    mockito java 我们都编写了单元测试,但是有时我们面临的挑战是被测单元可能依赖于其他组件. 并且配置其他组件进行单元测试绝对是一个过大的选择. 相反,我们可以使用Mocks代替其他组件,并继 ...

  5. 使用Mockito在Java中进行模拟入门

    我们都编写了单元测试,但是有时我们面临的挑战是被测单元可能依赖于其他组件. 并且配置其他组件进行单元测试绝对是一个过大的选择. 相反,我们可以使用Mocks代替其他组件,并继续进行单元测试. 为了说明 ...

  6. java mocked_java如何使用Mockito?

    这篇教程介绍了如何使用 Mockito 框架来给软件写测试用例 1. 预备知识 如果需要往下学习,你需要先理解 Junit 框架中的单元测试. 2. 使用mock对象来进行测试 2.1. 单元测试的目 ...

  7. java.lang.exception_如何解決java.lang.AssertionError:期望的異常:Mockito中的java.lang.Exception...

    我有一個使用spring驗證器的用戶驗證器的書面單元測試用例.下面是類.我在Spring驗證器的validate方法中面臨問題,調用服務來檢查用戶是否爲admin.但是管理服務會引發異常.所以我用tr ...

  8. 浅谈 Mockito:Java 单元测试神器

    背景 背景 Mockito 解决的问题 Mockito 的优点 优点 1:简单易用 优点 2:功能强大 优点 3:语法优美 小结 背景 记得刚开始学 Java 那会儿看过一个讲解 Mockito 的视 ...

  9. JAVA Junit error java.lang.SecurityException: class junit.framework.JUnit4TestCaseFacade

    运行junit4时报错: java.lang.SecurityException: class "junit.framework.JUnit4TestCaseFacade"'s s ...

最新文章

  1. 干货|一文全解深度学习中的卷积
  2. 牛客练习赛7 E 珂朵莉的数列
  3. python系统-python做系统
  4. USB CDC 可变形参
  5. 【最贴心】C++字符串转换(stoi;stol;stoul;stoll;stoull;stof;stod;stold)
  6. hive 自定义元数据表_[一起学Hive]之十四-Hive的元数据表结构详解
  7. java.sql.SQLException: ORA-28001: 口令已经失效
  8. 给你出道题 红绿灯问题
  9. VUE 项目如何快速优化?| 原力计划
  10. Caused by: java.lang.ClassNotFoundException: org.springframework.orm.hibernate4.HibernateTemplate
  11. MFC学习日志(一)
  12. android studio更改代码字体,Android Studio怎么改变代码字体大小?
  13. winXP系统如何打开剪贴板查看器
  14. 插值算法的Python实现方式
  15. 帆软报表 异常汇总及方案.
  16. 电路模电数电课程中卡诺图知识点(包括化简原则和步骤)
  17. STM32F0 、F1 在软件程序中写读保护选项字节(Option Bytes)
  18. 转行做美工设计有没有前途?0基础怎么学好美工设计?
  19. 服务器 ftp查询文件是否存在,ftp查看远程服务器文件是否存在
  20. S12(X)微控制器的Bootloader程序

热门文章

  1. JAVA SE 基础复习-基本程序设计(1)
  2. CentOS 6 下升级安装Mysql 5.5 完整步骤
  3. C# 动态装载 DLL
  4. 资源位图android4.2中为什么要高效的处理位图资源
  5. suse linux vnc 桌面号,在SUSE Linux下安装VNC的方法
  6. 设计灵感|展览海报的设计没有头绪?
  7. 手机电脑壁纸!让你的桌面变得超酷
  8. 素材路上|专注平面设计素材模板,可能会让你抛弃花瓣!
  9. 最火UI素材|短视频、直播APP套件,轻松搞定设计
  10. ubuntu 16.04安装mysql_Ubuntu 16.04 安装mysql 5.7.16