第一步下载对应的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. Mysql基础(二)

    多表连接 #多表查询 /* sql99标准 等值连接 ①多表等值连接的结果为多表的交集部分 ② n个连接至少需要 n-1个连接 ③一般需要为表起别名 ④可以搭配前面介绍的所有子句的使用,比如排序,分组 ...

  2. Parrot os更新内核及/boot空间清理

    升级时发现boot,空间满了,卸载以前的内核,清理空间. 如何升级内核请查看我上篇博客:https://www.cnblogs.com/junsec/p/11453049.html 卸载多余内核,清理 ...

  3. Redis详解(十三)------ Redis布隆过滤器

    本篇博客我们主要介绍如何用Redis实现布隆过滤器,但是在介绍布隆过滤器之前,我们首先介绍一下,为啥要使用布隆过滤器. 1.布隆过滤器使用场景 比如有如下几个需求: ①.原本有10亿个号码,现在又来了 ...

  4. Java实现 LeetCode 95 不同的二叉搜索树 II(二)

    95. 不同的二叉搜索树 II 给定一个整数 n,生成所有由 1 - n 为节点所组成的二叉搜索树. 示例: 输入: 3 输出: [ [1,null,3,2], [3,2,null,1], [3,1, ...

  5. Android Button的四种点击事件

    bta1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.m ...

  6. java实现串逐位和(C++)

    给定一个由数字组成的字符串,我们希望得到它的各个数位的和. 比如:"368" 的诸位和是:17 这本来很容易,但为了充分发挥计算机多核的优势,小明设计了如下的方案: int f(c ...

  7. SaaS权限设计总结

    2年前转到SaaS部门之后期间断断续续做着权限相关的业务,这篇文章主要回顾下过往的设计以及其原因和利弊. 不过因为是线上业务,会省略掉很多细节以及账号体系和权益相关得部分,只讨论权限相关. 本文也不会 ...

  8. 你真的了解EF吗?关于EntityFramework的高级优化

    接上一篇文章.现在写程序,做项目不是说功能做完就完事了,在平常的开发过程中对于性能的考虑也是极其重要的. 关于ef的那些事,今天就来说说吧.首先必须得知道.net ef在程序中的五种状态变化过程与原理 ...

  9. js排他性算法

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. 解Bug之路-记一次JVM堆外内存泄露Bug的查找

    解Bug之路-记一次JVM堆外内存泄露Bug的查找 前言 JVM的堆外内存泄露的定位一直是个比较棘手的问题.此次的Bug查找从堆内内存的泄露反推出堆外内存,同时对物理内存的使用做了定量的分析,从而实锤 ...