第一步下载对应的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的实际应用的更多相关文章

  1. Flutter实战视频-移动电商-07.Dio基础_POST请求的使用

    07.Dio基础_POST请求的使用 越界问题解决 容器越界的问题,越界是因为键盘弹起的问题.如果键盘不弹起是不会越界 我们加一个滚动组件就可以解决. 这是技术胖视频中出现的越界的截图效果 这是我自己 ...

  2. iOS系列 基础篇 07 Action动作和输出口

    iOS系列 基础篇 07 Action动作和输出口 目录:  1. 前言及案例说明 2. 什么是动作? 3. 什么是输出口? 4. 实战 5. 结尾 1. 前言及案例说明 上篇内容我们学习了标签和按钮 ...

  3. javaSE基础07

    javaSE基础07 一.static静态修饰符 用了static修饰的变量就会变成共享的属性,只会初始化一次,在内存中只存在一个,并且每个对象都可以访问,存放在方法区(数据共享区) 1.1 stat ...

  4. 测试--easymock的使用

    使用场景:对于调用其它类中的方法,但是还没有编写完,使用easymock进行单元测试,它提供这些没有编写完的代码期待的默认值. 使用步骤: step1: pom引入: <dependency&g ...

  5. 《HelloGitHub月刊》第07期

    最近工作上的事比较多,<HelloGitHub>月刊第07期拖到月底才发. 本期月刊对logo和月刊的排版进行了优化,不知道大家的反馈如何,还望大家多多反馈,让<HelloGitHu ...

  6. Mock之easymock, powermock, and mockito

    easymock, powermock, and mockito Easymock Class Mocking Limitations To be coherent with interface mo ...

  7. easymock所测试的方法内部新NEW对象的处理

    问题:当记录的方法的参数是方法所在类内部新NEW的对象时,静态的记录方法交互就会失效,例如 调用的方法: public calss A{ public void method(User u){ u.s ...

  8. Python array,list,dataframe索引切片操作 2016年07月19日——智浪文档

    array,list,dataframe索引切片操作 2016年07月19日——智浪文档 list,一维,二维array,datafrme,loc.iloc.ix的简单探讨 Numpy数组的索引和切片 ...

  9. 驱动开发学习笔记. 0.07 Uboot链接地址 加载地址 和 链接脚本地址

    驱动开发学习笔记. 0.07 Uboot链接地址 加载地址 和 链接脚本地址 最近重新看了乾龙_Heron的<ARM 上电启动及 Uboot 代码分析>(下简称<代码分析>) ...

随机推荐

  1. 2018京东校招Java笔试题

    相比阿里巴巴,京东的题都是考研基础题,加上一点java基础知识和linux命令. 1. 单选题(19道题,每题2分): 1)4个并发进程都需要5个同类资源,则至少需要多少个资源,才不会导致死锁? 2) ...

  2. Java找零钱算法

    买东西过程中,卖家经常需要找零钱.现用代码实现找零钱的方法,要求优先使用面额大的纸币,假设卖家有足够数量的各种面额的纸币. 下面给出的算法比较简单,也符合人的直觉:把找零不断地减掉小于它的最大面额的纸 ...

  3. 郭盛华:DNS新漏洞可使黑客可以发起大规模DDoS攻击

    近日,知名网络黑客安全专家.东方联盟创始人郭盛华微博披露了有关影响DNS协议的新缺陷的详细信息,该缺陷可被利用来发起放大的大规模分布式拒绝服务(DDoS)攻击,以击倒目标网站.该漏洞称为NXNSAtt ...

  4. SDL初识

    1.SDL是什么? SDL(Security Development Lifecycle)安全开发生命周期.是微软提出的从安全角度指导软件开发的管理模式,在软件开发的生命周期中尽可能地发现安全隐患,降 ...

  5. harbor越权漏洞(CVE-2019-16097)

    漏洞介绍 这个漏洞可以在注册发送post包时,加入has_admin_role:true就可以直接注册成为管理员,下图可以看看user的结构: 有很多属性,此处我们关注的是"HasAdmin ...

  6. Maven快速入门(三)Maven的坐标和仓库

    之前通过一个helloworld的例子来说一说如何创建maven项目以及maven项目的项目结构,然后讲maven如何编译运行项目.接下来介绍maven中几个比较重要的概念:坐标和仓库.Maven快速 ...

  7. js函数中的this关键字

    关于这个this关键字,也是很多项目中常常被用到的,那么,有人也许会问,干嘛要用this呢,在函数被调用时,直接指明是什么对象在调用不就行了?还整那么个模模糊糊的概念出来干嘛?不过嘛,存在即真理,既然 ...

  8. 【JSP】el、jstl、MVC、三层架构

    JSP[Java Server Pages] [概念] java服务器页面 简化的servlet设计 html语法中扩展java 跨平台 JSP全名为Java Server Pages,中文名叫jav ...

  9. Java实现 蓝桥杯VIP 基础练习 芯片测试

    问题描述 有n(2≤n≤20)块芯片,有好有坏,已知好芯片比坏芯片多. 每个芯片都能用来测试其他芯片.用好芯片测试其他芯片时,能正确给出被测试芯片是好还是坏.而用坏芯片测试其他芯片时,会随机给出好或是 ...

  10. Java实现 蓝桥杯VIP 算法训练 ALGO-16进制转换

    算法训练 进制转换 时间限制:1.0s 内存限制:256.0MB 问题描述 我们可以用这样的方式来表示一个十进制数: 将每个阿拉伯数字乘以一个以该数字所处位置的(值减1)为指数,以10为底数的幂之和的 ...