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 代码分析>(下简称<代码分析>) ...
随机推荐
- 域对象的作用范围 & 请求的转发和重定向
1. 和属性相关的方法: ①. 方法 void setAttribute(String name, Object o): 设置属性 Object getAttribute(String name): ...
- Apache Hudi在医疗大数据中的应用
本篇文章主要介绍Hudi在医疗大数据中的应用,主要分为5个部分进行介绍:1. 建设背景,2. 为什么选择Hudi,3. Hudi数据同步,4. 存储类型选择及查询优化,5. 未来发展与思考. 1. 建 ...
- Flutter,webview里面实现上传和下载的功能
前提:Flutter 与 webview(vue) 一起开发的项目 开始的时候并没有想到什么移动端的,所以上传就用input,下载就用iframe来实现,然而真机实测的时候,input那个方法IOS支 ...
- Rocket - diplomacy - BaseNode
https://mp.weixin.qq.com/s/eOgNLi_MJ8HJOpepGaaW8Q 简单介绍BaseNode的实现. 1. You cannot create a n ...
- Rocket - diplomacy - Node相关类
https://mp.weixin.qq.com/s/BvK3He3GWon8ywG8Jdmcsg 介绍Node相关的类. 1. BaseNode BaseNode是所有节点类的 ...
- (Java实现)洛谷 P2095 营养膳食
题目描述 Mr.L正在完成自己的增肥计划. 为了增肥,Mr.L希望吃到更多的脂肪.然而也不能只吃高脂肪食品,那样的话就会导致缺少其他营养.Mr.L通过研究发现:真正的营养膳食规定某类食品不宜一次性吃超 ...
- Java实现第十届蓝桥杯矩形切割
试题 B: 矩形切割 本题总分:5 分 [问题描述] 小明有一些矩形的材料,他要从这些矩形材料中切割出一些正方形. 当他面对一块矩形材料时,他总是从中间切割一刀,切出一块最大的正方 形,剩下一块矩形, ...
- Java学习之斐波那契数列实现
描述 一个斐波那契序列,F(0) = 0, F(1) = 1, F(n) = F(n-1) + F(n-2) (n>=2),根据n的值,计算斐波那契数F(n),其中0≤n≤1000. 输入 输入 ...
- LB服务:硬件如何被软件取代(上)
[摘要] 大业务上云,难免要用到LB.可是,您是否了解LB的来龙去脉?本文浅谈一下LB,从硬件走到软件,他们经历了什么转变. 大业务上云,难免要用到LB.可是,您是否了解LB的来龙去脉?本文浅谈一下L ...
- Babel 7 安装与配置
Babel:帮我们把高级的语法(ES6)转为低级的语法 /* Babel 7.x版本 安装如下 (cnpm i @babel/cli -D) //Bab ...