07.Easymock的实际应用
第一步下载对应的java包添加到工程中

并静态导入所需要的j类
import static org.easymock.EasyMock.*;
这里有的注意点
package com.fjnu.service; import java.util.HashMap;
import java.util.Map; import com.fjnu.model.User;
import com.weiyuan.dao.IUserDao;
import com.weiyuan.dao.UserDao; public class UserService implements IUserService { private IUserDao userDao; public UserService(IUserDao userDao) {
super();
this.userDao = userDao;
} public UserService() {
super();
} @Override
public void add(User user) {
// TODO Auto-generated method stub
if(load(user.getUsername()) != null){
try {
throw new Exception("用户名已存在");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
userDao.addUser(user);
} @Override
public void delete(String username) {
// TODO Auto-generated method stub
userDao.deleteUser(username);
} @Override
public User load(String username) {
// TODO Auto-generated method stub
return userDao.load(username);
} @Override
public User login(String username, String password) {
// TODO Auto-generated method stub
return null;
} }
原来的业务代码在上面的部分不存在问题
我们添加联系人的时候:交互的流程是如果联系人存在我们就抛出联系人存在的异常,不执行后续的登录操作
但是上面的代码,我们知道联系人存在之后 throw new Exception("用户名已存在");但是这个异常又被try catch处理了,等于没有抛出任何异常等于打印了日志
上面的代码应该修改为下面的形式
我们在easymock进行测试的时候代码就会报错,说明业务逻辑方法存在问题,需要进行修改
/***
* 验证添加操作的时候用户已经存在
* @throws Exception
* */
@Test(expected = Exception.class)
public void testAddExits() throws Exception{
//第一步验证从数据库中查询,该联系人存在,返回联系人存在的异常
expect(userDao.load("admin")).andReturn(baseUser);
//第二步添加联系人
userDao.addUser(baseUser);
expectLastCall();
//记录上述状态
replay(userDao);
//验证userService.add的操作流程是否是按照上面的第一步和第二步来执行的。验证是业务的流程
userService.add(baseUser);
verify(userDao);
}
运行报错

如果联系人存在需要抛出异常,但是上面的代码没有抛出任何异常,所以报错,代码应该修改为
package com.fjnu.service; import java.util.HashMap;
import java.util.Map; import com.fjnu.model.User;
import com.weiyuan.dao.IUserDao;
import com.weiyuan.dao.UserDao; public class UserService implements IUserService { private IUserDao userDao; public UserService(IUserDao userDao) {
super();
this.userDao = userDao;
} public UserService() {
super();
} @Override
public void add(User user) {
// TODO Auto-generated method stub
if(load(user.getUsername()) != null){
throw new RuntimeException("用户名已经存在"); }
userDao.addUser(user);
} @Override
public void delete(String username) {
// TODO Auto-generated method stub
userDao.deleteUser(username);
} @Override
public User load(String username) {
// TODO Auto-generated method stub
return userDao.load(username);
} @Override
public User login(String username, String password) {
// TODO Auto-generated method stub
return null;
}
}
接下来我们验证登陆操作的业务交互,登陆操作的业务交互分为三种情况,第一登陆成功,第二登陆失败原因用户名不存在,第三种情况登陆成功密码错误
如何实现了
package com.fjnu.service; import java.util.HashMap;
import java.util.Map; import com.fjnu.model.User;
import com.weiyuan.dao.IUserDao;
import com.weiyuan.dao.UserDao; public class UserService implements IUserService { private IUserDao userDao; public UserService(IUserDao userDao) {
super();
this.userDao = userDao;
} public UserService() {
super();
} @Override
public void add(User user) {
// TODO Auto-generated method stub
if(load(user.getUsername()) != null){
throw new RuntimeException("用户名已经存在"); }
userDao.addUser(user);
} @Override
public void delete(String username) {
// TODO Auto-generated method stub
userDao.deleteUser(username);
} @Override
public User load(String username) {
// TODO Auto-generated method stub
return userDao.load(username);
} @Override
public User login(String username, String password) {
// TODO Auto-generated method stub
//第一步去通过用户名去查询用户是否存在
User load = userDao.load(username);
if(load == null){
throw new RuntimeException("用户名不存在");
}
//比较密码是否相等
if(!load.getPassword().equalsIgnoreCase(password)){
throw new RuntimeException("密码不成功");
}
return load;
} }
我们来看easymock的代码
package com.fjnu.service; import org.easymock.EasyMock;
import org.junit.Before;
import org.junit.Test; import static org.junit.Assert.*;
import static org.easymock.EasyMock.*; import com.fjnu.model.User;
import com.weiyuan.dao.IUserDao; /**
* mock代码是测试人员编写
* 1、这里测试的是操作联系人的业务类UserService的业务操作流程是否正确
* 2、UserService操作需要具体的userdao,但是userdao可能还正在开发中,
* 我们只需要知道userdao的接口对象IUserDao,我们就可以使用mock模拟创建一个具体userdao类,提供给userserice使用
* 3、使用easymock我们验证的是userservice的业务交互流程是否正确,验证的是业务的交互流程
* */
public class TestUserServiceByEasymock {
private IUserService userService;
private IUserDao userDao;
private User baseUser; @Before
public void setUp(){
//创建所需要的mock对象
userDao =EasyMock.createStrictMock(IUserDao.class);
userService = new UserService(userDao);
baseUser = new User("admin", "123", "超级管理员878");
} private void assertUserEquals (User u, User tu){
assertEquals("add方法有错误!", u.getUsername(), tu.getUsername());
assertEquals("add方法有错误!", u.getNickname(), tu.getNickname());
assertEquals("add方法有错误!", u.getPassword(), tu.getPassword());
} //测试查询操作是否成功
@Test
public void testLoad(){
expect(userDao.load("admin")).andReturn(baseUser);
replay(userDao);
User user = userService.load("admin");
assertUserEquals(user, baseUser);
verify(userDao);
} //测试删除操作是否成功
@Test
public void testDelete(){
//没有返回值
userDao.deleteUser("admin");
//没有返回值
expectLastCall();
replay(userDao);
//执行业务操作
userService.delete("admin");
verify(userDao); } //测试添加一个用户,用户在数据库中不存在
/***
* mock验证是整个业务的操作流程是否正确
* 验证userService.add的操作流程是否是按照上面的第一步和第二步来执行的。验证是业务的流程
* */
@Test
public void testAddNotExits(){
//第一步验证从数据库中查询,该联系人不存在返回值是null
expect(userDao.load("admin")).andReturn(null);
//第二步添加联系人
userDao.addUser(baseUser);
expectLastCall();
//记录上述状态
replay(userDao);
//验证userService.add的操作流程是否是按照上面的第一步和第二步来执行的。验证是业务的流程
try {
userService.add(baseUser);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
verify(userDao); } /***
* 验证添加操作的时候用户已经存在
* @throws Exception
* */
@Test(expected = Exception.class)
public void testAddExits() throws Exception{
//第一步验证从数据库中查询,该联系人存在,返回联系人存在的异常
expect(userDao.load("admin")).andReturn(baseUser);
//第二步添加联系人
userDao.addUser(baseUser);
expectLastCall();
//记录上述状态
replay(userDao);
//验证userService.add的操作流程是否是按照上面的第一步和第二步来执行的。验证是业务的流程
userService.add(baseUser);
verify(userDao);
} /*模拟登陆成功*/
@Test
public void testLoginOk() throws Exception{
//第一步验证从数据库中查询,该联系人存在,返回联系人存在的异常
expect(userDao.load("admin")).andReturn(baseUser);
//记录上述状态
replay(userDao);
//验证userService.add的操作流程是否是按照上面的第一步和第二步来执行的。验证是业务的流程
userService.login("admin", "123");
verify(userDao);
} /*模拟登陆失败,用户不存在*/
@Test(expected = Exception.class)
public void testLoginErrorUserNotExits() throws Exception{
//第一步验证从数据库中查询,该联系人存在,返回联系人存在的异常
expect(userDao.load("admin")).andReturn(null);
//记录上述状态
replay(userDao);
//验证userService.add的操作流程是否是按照上面的第一步和第二步来执行的。验证是业务的流程
userService.login("admin", "123");
verify(userDao);
} /*模拟登陆失败,密码错误*/
@Test(expected = Exception.class)
public void testLoginErrorPasswordError() throws Exception{
//第一步验证从数据库中查询,该联系人存在,返回联系人存在的异常
expect(userDao.load("admin")).andReturn(baseUser);
//记录上述状态
replay(userDao);
//验证userService.add的操作流程是否是按照上面的第一步和第二步来执行的。验证是业务的流程
//mock对象的密码返回值是baseUser的123,这里我们使用的是1234,所以这里就模拟了密码错误,会抛出异常
userService.login("admin", "1234");
verify(userDao);
} }
代码下载地址
链接:https://pan.baidu.com/s/1osMlhTgoT0KbuMe5XKmwXw 密码:a7f4
07.Easymock的实际应用的更多相关文章
- Flutter实战视频-移动电商-07.Dio基础_POST请求的使用
07.Dio基础_POST请求的使用 越界问题解决 容器越界的问题,越界是因为键盘弹起的问题.如果键盘不弹起是不会越界 我们加一个滚动组件就可以解决. 这是技术胖视频中出现的越界的截图效果 这是我自己 ...
- iOS系列 基础篇 07 Action动作和输出口
iOS系列 基础篇 07 Action动作和输出口 目录: 1. 前言及案例说明 2. 什么是动作? 3. 什么是输出口? 4. 实战 5. 结尾 1. 前言及案例说明 上篇内容我们学习了标签和按钮 ...
- javaSE基础07
javaSE基础07 一.static静态修饰符 用了static修饰的变量就会变成共享的属性,只会初始化一次,在内存中只存在一个,并且每个对象都可以访问,存放在方法区(数据共享区) 1.1 stat ...
- 测试--easymock的使用
使用场景:对于调用其它类中的方法,但是还没有编写完,使用easymock进行单元测试,它提供这些没有编写完的代码期待的默认值. 使用步骤: step1: pom引入: <dependency&g ...
- 《HelloGitHub月刊》第07期
最近工作上的事比较多,<HelloGitHub>月刊第07期拖到月底才发. 本期月刊对logo和月刊的排版进行了优化,不知道大家的反馈如何,还望大家多多反馈,让<HelloGitHu ...
- Mock之easymock, powermock, and mockito
easymock, powermock, and mockito Easymock Class Mocking Limitations To be coherent with interface mo ...
- easymock所测试的方法内部新NEW对象的处理
问题:当记录的方法的参数是方法所在类内部新NEW的对象时,静态的记录方法交互就会失效,例如 调用的方法: public calss A{ public void method(User u){ u.s ...
- Python array,list,dataframe索引切片操作 2016年07月19日——智浪文档
array,list,dataframe索引切片操作 2016年07月19日——智浪文档 list,一维,二维array,datafrme,loc.iloc.ix的简单探讨 Numpy数组的索引和切片 ...
- 驱动开发学习笔记. 0.07 Uboot链接地址 加载地址 和 链接脚本地址
驱动开发学习笔记. 0.07 Uboot链接地址 加载地址 和 链接脚本地址 最近重新看了乾龙_Heron的<ARM 上电启动及 Uboot 代码分析>(下简称<代码分析>) ...
随机推荐
- 【译】Gartner CWPP市场指南
https://www.gartner.com/doc/reprints?id=1-1YSHGBQ8&ct=200416&st=sb?utm_source=marketo&ut ...
- 实现 (5).add(3).minus(2),使其输出结果为:6
function check(n) { n = Number(n); return isNaN(n) ? 0 : n; } function add(n) { n = check(n); return ...
- Redis 入门到分布式 (四) 瑞士军刀Redis其他功能
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 目录: 慢查询 Pipeline 发布订阅 Bitmap(位图) HyperLogLog GEO 一.慢 ...
- Java并发编程 (三) 项目准备
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一.案例环境初始化 1.环境搭建与准备 Spring Boot 项目,https://start.spr ...
- Java实现 蓝桥杯VIP 算法训练 连通分块(并查集)
试题 算法训练 连通分块 资源限制 时间限制:200ms 内存限制:8.0MB 问题描述 连通分块 输入格式 输入的第一行包含两个整数n, m n代表图中的点的个数,m代表边的个数 接下来m行,每行2 ...
- Java实现 LeetCode 480 滑动窗口中位数
480. 滑动窗口中位数 中位数是有序序列最中间的那个数.如果序列的大小是偶数,则没有最中间的数:此时中位数是最中间的两个数的平均数. 例如: [2,3,4],中位数是 3 [2,3],中位数是 (2 ...
- 第四届蓝桥杯JavaC组国(决)赛真题
解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.好好学习 汤姆跟爷爷来中国旅游.一天,他帮助中国的小朋友贴标语.他负责贴的标语是分别写在四块红纸上的四个大字:"好.好.学. ...
- Java实现 洛谷 P1028 数的计算
import java.util.Scanner; import java.util.Arrays; public class Main { private static Scanner cin; p ...
- Java实现 蓝桥杯 历届试题 大臣的旅费
问题描述 很久以前,T王国空前繁荣.为了更好地管理国家,王国修建了大量的快速路,用于连接首都和王国内的各大城市. 为节省经费,T国的大臣们经过思考,制定了一套优秀的修建方案,使得任何一个大城市都能从首 ...
- Java实现第八届蓝桥杯最大公共子串
最大公共子串 最大公共子串长度问题就是: 求两个串的所有子串中能够匹配上的最大长度是多少. 比如:"abcdkkk" 和 "baabcdadabc", 可以找到 ...