java junit mock_使用Mockito进行Java的Mock测试
测试替身
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测试相关推荐
- Java单元测试之模拟利器-使用PowerMock进行Mock测试
首页 国产Linux Linux命令 openSUSE ArchLinux Slackware FreeBSD Ubuntu CentOS Fedora Debian PHP教程 在线教程 登录 注册 ...
- java junit 异常_JUnit:使用Java 8和Lambda表达式测试异常
java junit 异常 在JUnit中,有许多方法可以在测试代码中测试异常,包括try-catch idiom JUnit @Rule和catch-exception库. 从Java 8开始,我们 ...
- Java Mocking入门—使用Mockito
我们都会编写单元测试程序,但我们当前所面临的挑战是被测单元可能依赖于其他组件.而对于单元测试配置其他组件,绝对是过枉矫正.相反,我们可以使用Mocks框架代替其他组件,继续进行单元测试. 为了展现如何 ...
- mockito java_使用Mockito在Java中进行模拟入门
mockito java 我们都编写了单元测试,但是有时我们面临的挑战是被测单元可能依赖于其他组件. 并且配置其他组件进行单元测试绝对是一个过大的选择. 相反,我们可以使用Mocks代替其他组件,并继 ...
- 使用Mockito在Java中进行模拟入门
我们都编写了单元测试,但是有时我们面临的挑战是被测单元可能依赖于其他组件. 并且配置其他组件进行单元测试绝对是一个过大的选择. 相反,我们可以使用Mocks代替其他组件,并继续进行单元测试. 为了说明 ...
- java mocked_java如何使用Mockito?
这篇教程介绍了如何使用 Mockito 框架来给软件写测试用例 1. 预备知识 如果需要往下学习,你需要先理解 Junit 框架中的单元测试. 2. 使用mock对象来进行测试 2.1. 单元测试的目 ...
- java.lang.exception_如何解決java.lang.AssertionError:期望的異常:Mockito中的java.lang.Exception...
我有一個使用spring驗證器的用戶驗證器的書面單元測試用例.下面是類.我在Spring驗證器的validate方法中面臨問題,調用服務來檢查用戶是否爲admin.但是管理服務會引發異常.所以我用tr ...
- 浅谈 Mockito:Java 单元测试神器
背景 背景 Mockito 解决的问题 Mockito 的优点 优点 1:简单易用 优点 2:功能强大 优点 3:语法优美 小结 背景 记得刚开始学 Java 那会儿看过一个讲解 Mockito 的视 ...
- JAVA Junit error java.lang.SecurityException: class junit.framework.JUnit4TestCaseFacade
运行junit4时报错: java.lang.SecurityException: class "junit.framework.JUnit4TestCaseFacade"'s s ...
最新文章
- 干货|一文全解深度学习中的卷积
- 牛客练习赛7 E 珂朵莉的数列
- python系统-python做系统
- USB CDC 可变形参
- 【最贴心】C++字符串转换(stoi;stol;stoul;stoll;stoull;stof;stod;stold)
- hive 自定义元数据表_[一起学Hive]之十四-Hive的元数据表结构详解
- java.sql.SQLException: ORA-28001: 口令已经失效
- 给你出道题 红绿灯问题
- VUE 项目如何快速优化?| 原力计划
- Caused by: java.lang.ClassNotFoundException: org.springframework.orm.hibernate4.HibernateTemplate
- MFC学习日志(一)
- android studio更改代码字体,Android Studio怎么改变代码字体大小?
- winXP系统如何打开剪贴板查看器
- 插值算法的Python实现方式
- 帆软报表 异常汇总及方案.
- 电路模电数电课程中卡诺图知识点(包括化简原则和步骤)
- STM32F0 、F1 在软件程序中写读保护选项字节(Option Bytes)
- 转行做美工设计有没有前途?0基础怎么学好美工设计?
- 服务器 ftp查询文件是否存在,ftp查看远程服务器文件是否存在
- S12(X)微控制器的Bootloader程序
热门文章
- JAVA SE 基础复习-基本程序设计(1)
- CentOS 6 下升级安装Mysql 5.5 完整步骤
- C# 动态装载 DLL
- 资源位图android4.2中为什么要高效的处理位图资源
- suse linux vnc 桌面号,在SUSE Linux下安装VNC的方法
- 设计灵感|展览海报的设计没有头绪?
- 手机电脑壁纸!让你的桌面变得超酷
- 素材路上|专注平面设计素材模板,可能会让你抛弃花瓣!
- 最火UI素材|短视频、直播APP套件,轻松搞定设计
- ubuntu 16.04安装mysql_Ubuntu 16.04 安装mysql 5.7.16