Junit Hamcrest Mockito单元测试
pom.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>TestPractice</groupId>
<artifactId>TestPractice</artifactId>
<version>1.0</version> <dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency> <dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>1.9.5</version>
<scope>test</scope>
</dependency> <dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-all</artifactId>
<version>1.1</version>
<scope>test</scope>
</dependency>
</dependencies> </project>
1. Junit与Hamcrest
package com.test.foo; public class Foo {
public String concat(String s1, String s2) {
if (s1 == null) return s2;
return s1 + s2;
}
} package com.test.foo; import org.hamcrest.Matcher;
import org.junit.*; import java.util.ArrayList;
import java.util.List; import static junit.framework.Assert.assertTrue;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.hasItem;
import static org.hamcrest.Matchers.is;
import static org.junit.Assume.assumeThat;
import static org.mockito.Matchers.contains;
import static org.mockito.Mockito.when; public class FooTest {
private Foo foo; /**
* @BeforeClass @AfterClass 设置在public 静态方法之上,表示在class加载之前执行。
* 这样设置的方法只会执行一次。而@Before @After则会再每次test之前/之后执行
*/
@Before
public void setUp() {
foo = new Foo();
} /**
* Ignore标签表示忽略次测试
*/
@Test
public void concatTwoSubstringFirstIsNull() {
String actual = foo.concat(null, "s2"); String expected = "s2";
Assert.assertEquals(expected, actual);
} // expected表示期望值
@Test(expected = RuntimeException.class)
public void testException() {
throw new RuntimeException();
} /**
* Hamcrest方法测试
*/
@Test
@Ignore
public void testHamcrest() {
int i = 10;
assumeThat(i, is(10)); // 前置条件,如果不满足,则不执行后置代码
List<String> list = new ArrayList<String>();
list.add("s1");
list.add("s2"); assertTrue(list.contains("s5")); // hamcrest的assertThat可以直接对list进行判断
assertThat(list, hasItem("s5"));
} /**
* Mockito方法测试
*/
// public void testMock() {
// Man mockMan = mock(man);
// // 当真的执行到save方法时,会比对实际参数和expectedMan的符合程度,然后返回true 发了塞
// when(mockMan.save(expectedMan)).thenReturn(true);
// } @After
public void tearDown() {
foo = null;
}
}
2. Mockito
package com.test.foo.model; public class User {
private String username;
private String passwd; public User(String username, String passwd) {
this.username = username;
this.passwd = passwd;
} public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getPasswd() {
return passwd;
} public void setPasswd(String passwd) {
this.passwd = passwd;
} @Override
public boolean equals(Object o) {
if (!(o instanceof User))
return false;
User user = (User) o;
return username.equals(user.getUsername())
&& passwd.equals(user.getPasswd());
}
} package com.test.foo.dao; import com.test.foo.model.User; public class UserDAO {
public void saveUser(User user) {} public String test() {
return "Original methods";
}
} package com.test.foo.service; import com.test.foo.dao.UserDAO;
import com.test.foo.model.User; public class UserService {
UserDAO userDao; public void saveUser(User user) {
userDao.saveUser(user);
} public UserDAO getUserDao() {
return userDao;
} public void setUserDao(UserDAO userDao) {
this.userDao = userDao;
}
} package com.test.foo.service; import com.test.foo.dao.UserDAO;
import com.test.foo.model.User;
import org.junit.Test;
import org.junit.Before;
import org.junit.After;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations; import javax.annotation.Resource; import static org.mockito.Mockito.*; /**
* UserService Tester.
*
* @author <Authors name>
* @since <pre>Jul 12, 2013</pre>
* @version 1.0
*/
public class UserServiceTest {
// 自动mock注入
@InjectMocks
@Resource(name="userService")
private UserService userService; // mock对象,实际上mock对象里面的方法都已经置空,我们需要掌握的是他执行方法的时机
// 以及执行方法时的参数
@Mock
private UserDAO userDao; @Before
public void before() throws Exception {
MockitoAnnotations.initMocks(this);
} @After
public void after() throws Exception {
} /**
*
* Method: saveUser(User user)
*
*/
@Test
public void testSaveUser() throws Exception {
User user = new User("username2", "passwd");
User expectUser = new User("username", "passwd");
// 测试void方法使用doThrow,当调用saveUser()而且,user和expectUser相同时,则会抛出异常,以此检查传入的User是否正确
doThrow(new RuntimeException()).when(userDao).saveUser(expectUser);
userDao.saveUser(user);
// 定制方法返回值
when(userDao.test()).thenReturn("customize userDao.test()");
System.out.println(userDao.test()); // 重置方法
Mockito.reset(userDao);
System.out.println(userDao.test()); // 将一个对象变为Spy对象,他的作用是让这个对象在保持原功能的基础上接受监视
User spy = Mockito.spy(user);
System.out.println(spy.getPasswd());
when(spy.getPasswd()).thenReturn("Passwd was stolen");
System.out.println(spy.getPasswd());
} }
输出
customize userDao.test()
null
passwd
Username was stolen
Junit Hamcrest Mockito单元测试的更多相关文章
- JUnit + Mockito 单元测试
原 JUnit + Mockito 单元测试(二) 2015年01月05日 17:26:02 sp42a 阅读数:60755 版权声明:本文为博主原创文章,未经博主允许不得转载. https://bl ...
- 一文让你快速上手 Mockito 单元测试框架
前言 在计算机编程中,单元测试是一种软件测试方法,通过该方法可以测试源代码的各个单元功能是否适合使用.为代码编写单元测试有很多好处,包括可以及早的发现代码错误,促进更改,简化集成,方便代码重构以及许多 ...
- JUnit + Mockito 单元测试(二)(good)
import org.junit.Test; import org.mockito.Matchers; import org.mockito.Mockito; import java.util.Lis ...
- Android 单元测试(junit、mockito、robolectric)
1.运用JUnit4 进行单元测试 首先在工程的 src 文件夹内创建 test 和 test/java 文件夹. 打开工程的 build.gradle(Module:app)文件,添加JUnit4依 ...
- JUnit + Mockito 单元测试(二)
摘自: http://blog.csdn.net/zhangxin09/article/details/42422643 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 入门 ...
- 使用 Mockito 单元测试 – 教程
tanyuanji@126.com 版本历史 - - - - 使用 Mockito 进行测试 该教程主要讲解 Mockito 框架在Eclipse IDE 中的使用 目录 tanyuanji@12 ...
- Mockito单元测试
Mockito简介 Mockito是一个单元测试框架,需要Junit的支持.在我们的项目中,都存在相当多的依赖关系,当我们在测试某一个业务相关的接口或则方法时,绝大多数时候是没有办法或则很难去添加所有 ...
- Spring整合JUnit框架进行单元测试代码使用详解
一.Spring提供的JUnit框架扩展: 1. AbstractSpringContextTests:spring中使用spring上下文测试的Junit扩展类,我们一般不会使用这个类来进行单元 ...
- java使用Junit工具进行单元测试
目录 1.类的定义: 2.Junit工具的使用: 3.对该类进行单元测试并查看结果: 4.记录各个阶段的时间 5.将过程记录在个人博客上(github地址) 1.类的定义:类是同一事物的总称,类是封装 ...
随机推荐
- Cookie机制和Session机制
1. cookie 1. Cookie 是在HTTP协议下,服务器或脚本可以维护客户工作站上信息的一种方式.Cookie 是由 Web服务器保存在用户浏览器(客户端)上的小文本文件(内容通常经过加密) ...
- JavaScript 中的原型(总则)
1. 一切函数都是对象 2. 一切对象都是由函数创建的,所有函数都是由Function创建的,每个函数都是一个Function对象. 3. 对象.__proto__ === 函数.prototype ...
- Rookey.Frame v1.0快速开发平台-用户登录
上一次介绍的了Rookey.Frame v1.0快速开发平台的整体功能,接下来会对各个功能点进行解析说明,今天给大家介绍下系统登录功能. 用户登录 系统中基本上所有功能页面都是从后台代码拼接后返回的, ...
- poj2078 Matrix(DFS)
题目链接 http://poj.org/problem?id=2078 题意 输入一个n×n的矩阵,可以对矩阵的每行进行任意次的循环右移操作,行的每一次右移后,计算矩阵中每一列的和的最大值,输出这些最 ...
- 【记录】mysql 5.7.20安装 出现...mysql-5.7.20-winx64\data\is_writable’ Errcode: 2 - No such file or directory
新到一家公司,安装mysql5.7.20时候出现一个问题(安装步骤可以参考这个): ...mysql-5.7.20-winx64\data\is_writable’ Errcode: 2 - No s ...
- GeneXus手机开发基础配置
最近使用GeneXus15 U3版本做了几个手机端的项目,感觉还不错,开发速度很快,而且想要的功能也都实现了.其中有一些常用的配置和小技巧和大家分享一下. 基础环境要求 如果想开发Android程序, ...
- /etc/default/useradd配置文件详解
/etc/default/useradd文件内容如下: [xf@xuexi ~]$ cat /etc/default/useradd # useradd defaults file GROUP=100 ...
- FastReport.Net使用:[24]其他控件(邮政编码(Zip Code),网格文本(Cellular Text)以及线性刻度尺(Linear Gauge))
邮政编码(Zip Code) Zip Code仅支持数字(0~9) Zip Code支持数据列绑定,表达式,文本等模式 可通过修改SegmentCount属性的值来确定Zip Code的位数. 数字右 ...
- UOJ #30. [CF Round #278] Tourists
UOJ #30. [CF Round #278] Tourists 题目大意 : 有一张 \(n\) 个点, \(m\) 条边的无向图,每一个点有一个点权 \(a_i\) ,你需要支持两种操作,第一种 ...
- [BZOJ4560][JLOI2016]字符串覆盖(贪心+DP)
先用KMP求出所有可以放的位置,然后两个值分别处理. 最大值: 贪心,4!枚举放的先后位置顺序,2^3枚举相邻两个串是否有交. 若有交,则后一个的起始位置一定是离前一个的结束位置最近的位置,无交也一样 ...