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 代码分析>(下简称<代码分析>) ...
随机推荐
- java第十三周课后作业 0529
1.把多个企鹅的信息添加到集合中查看企鹅的数量及所有企鹅的信息删除集合中部分企鹅的元素判断集合中是否包含指定企鹅 package homework; import java.util.ArrayLis ...
- CVE-2019-7238 poc
from requests.packages.urllib3.exceptions import InsecureRequestWarning import urllib3 import reques ...
- 一次FGC导致CPU飙高的排查过程
今天测试团队反馈说,服务A的响应很慢,我在想,测试环境也会慢?于是我自己用postman请求了一下接口,真的很慢,竟然要2s左右,正常就50ms左右的. 于是去测试服务器看了一下,发现服务器负载很高, ...
- appnium(一)简介
一.appium简介 1,appium是开源的移动端自动化测试框架: 2,appium可以测试原生的.混合的.以及移动端的web项目: 3,appium可以测试ios,android应用(当然了,还有 ...
- Beta冲刺 ——5.27
这个作业属于哪个课程 软件工程 这个作业要求在哪里 Beta冲刺 这个作业的目标 Beta冲刺 作业正文 正文 github链接 项目地址 其他参考文献 无 一.会议内容 1.组员一起学习Git分支管 ...
- ionic3跳转页面的方法
ionic3很好很强大,有人喷有人赞.不想参与其中,个人认为如果能很好的满足需求,好坏都是无所谓的,最合适的才是最好的.总结下最近使用ionic3的一些知识点,方便以后查询.多句嘴:会ionic3和只 ...
- css 段落文字换行问题
项目中遇到的一个小问题,以前没有注意到: 超链接超出父级元素,想着给a标签加宽度但是没有效果... 后来发现两个很好用的css属性 1.word-wrap 用来控制换行 取值: (1)normal ...
- Java实现 LeetCode 623 在二叉树中增加一行(遍历树)
623. 在二叉树中增加一行 给定一个二叉树,根节点为第1层,深度为 1.在其第 d 层追加一行值为 v 的节点. 添加规则:给定一个深度值 d (正整数),针对深度为 d-1 层的每一非空节点 N, ...
- Java实现 蓝桥杯 算法提高 成绩排序2
试题 算法提高 成绩排序2 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 给出n个学生的成绩,将这些学生按成绩排序,排序规则:总分高的在前:总分相同,数学成绩高的在前:总分与数学相 ...
- MySQL死锁及解决方案
一.MySQL锁类型 1. MySQL常用存储引擎的锁机制 MyISAM和MEMORY采用表级锁(table-level locking) BDB采用页面锁(page-level locking)或表 ...