03.基于测试开发讲解和Cobertura框架介绍
首先我们先
CREATE TABLE `t_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(200) DEFAULT NULL,
`password` varchar(200) DEFAULT NULL,
`nickname` varchar(200) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

我们使用jdbc来操作数据库
我们首先导入需要使用到的jar包

接下来我们编写对应的DButils工具
package com.weiyuan.test; import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException; public class DBUtils { public static Connection getConnection() throws SQLException{
Connection connection= null;
connection = DriverManager.getConnection("jdbc:mysql://localhost/test_junit","root","123456");
return connection;
} public static void close(Connection connection) {
if(connection !=null){
try {
connection.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} public static void close(PreparedStatement ps) {
if(ps !=null){
try {
ps.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} public static void close(ResultSet rs) {
if(rs !=null){
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
package com.weiyuan.dao;
import com.fjnu.model.User;
public interface IUserDao {
public void addUser(User user);
public void deleteUser(String username);
public User load(String username);
}
package com.weiyuan.dao; import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException; import com.fjnu.model.User;
import com.weiyuan.test.DBUtils; public class UserDao implements IUserDao{ @Override
public void addUser(User user) {
// TODO Auto-generated method stub
Connection connection = null;
PreparedStatement ps = null; try {
connection = DBUtils.getConnection();
String sql = "insert into t_user (username,password,nickname) value (?,?,?)";
ps= connection.prepareStatement(sql);
ps.setString(1, user.getUsername());
ps.setString(2, user.getPassword());
ps.setString(3, user.getNickname());
ps.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
DBUtils.close(connection);
DBUtils.close(ps);
} } @Override
public void deleteUser(String username) {
// TODO Auto-generated method stub } @Override
public User load(String username) { Connection connection = null;
PreparedStatement ps = null;
User user = null;
ResultSet rs = null;
System.out.println("load is calle");
try {
connection = DBUtils.getConnection();
String sql = "select * from t_user where username = ?";
ps= connection.prepareStatement(sql);
ps.setString(1, username);
rs= ps.executeQuery();
while(rs.next()){
if(user == null){
user = new User();
}
System.out.println("load is222 calle");
user.setId(rs.getInt("id"));
user.setUsername(rs.getString("username"));
user.setPassword(rs.getString("password"));
user.setNickname(rs.getString("nickname"));
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
DBUtils.close(connection);
DBUtils.close(ps);
DBUtils.close(rs);
}
return user;
} }
接下来是具体的业务实现类
package com.fjnu.service;
import com.fjnu.model.User;
public interface IUserService {
public void add(User user);
public void delete(String username);
public User load(String username);
public User login(String username, String password);
}
package com.fjnu.service; import java.util.HashMap;
import java.util.Map; import com.fjnu.model.User;
import com.weiyuan.dao.UserDao; public class UserService implements IUserService { private UserDao userDao; public UserService(UserDao 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;
} }
接下来在我们的test下编写我们的业务测试类,包名要和具体的src上的业务在同一个报下package com.fjnu.service;

package com.fjnu.service; import static org.junit.Assert.*; import org.junit.Before;
import org.junit.Test; import com.fjnu.model.User;
import com.weiyuan.dao.UserDao; public class TestUserService {
private IUserService us;
private User baseUser; @Before
public void setUp(){
// 初始化
us = new UserService(new UserDao());
baseUser = new User("admin", "123", "管理员");
} 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 testAdd(){
User u = baseUser;
us.add(u);
User tu = us.load("admin");
assertNotNull(tu);
assertUserEquals(u, tu);
//fail("请加入添加的测试代码");
} @Test(expected=Exception.class)
public void AddExistUsername(){
us.add(baseUser);
User tu = new User("admin", "1234", "alskdf");
us.add(tu);
} @Test
public void testDelete(){
us.add(baseUser);
User tu = us.load(baseUser.getUsername());
assertNotNull(tu);
us.delete(baseUser.getUsername());
tu = us.load(baseUser.getUsername());
assertNull(tu);
} @Test
public void testLogin(){
us.add(baseUser);
String username=baseUser.getUsername();
String password=baseUser.getPassword();
User tu = us.login(username, password);
assertUserEquals(baseUser, tu);
} @Test(expected=Exception.class)
public void testNotExistsUserLogin(){
us.add(baseUser);
String username="admin1";
String password="123";
us.login(username, password);
} @Test(expected=Exception.class)
public void testPasswordErrorUserLogin(){
us.add(baseUser);
String username="admin";
String password="1235";
us.login(username, password);
}
}
这样就完成了测试,但是在测试的过程中会对数据库中的数据产生影响,我们可以使用下面的这种方式来解决
Stub和Mock综述
为何使用Stub和Mock呢?在现实的开发过程中,需要去测试的一个方法并不总是单独存在的,它可能依赖其他方法或者类,比如你要测试service层的逻辑,可能依赖于dao层的数据交互;测试dao层的数据库交互方法,可能会需要去连接数据库。有了Stub和Mock可以降低它们的复杂性,没必要说一定要有数据库连接才能去测试service层的业务逻辑,假如我开发service层的,就没有没必要等同事将DAO层的代码写好,来验证service层的业务逻辑是否正确。
Stub简单介绍
Stub是一个虚拟的物件,一个Stub可以使用最少的依赖方法来模拟该单元测试。简单的说,stub是代码的一部分。在运行时用stub替换真正代码,忽略调用代码的实现。目的是用一个简单一点的行为替换一个复杂的行为,从而独立地测试代码的某一部分。比如,要测试dao层的代码,势必要连接数据库,这时候就可以使用HashMap来模拟数据库操作,这个Stub对象就可以根据你想要的状态去模拟,通过方法去测试Stub的内部状态。可以使用map的方式以及dbUtil来实现stub测试。
package com.weiyuan.dao;
import java.util.HashMap;
import com.fjnu.model.User;
public class UserDaoByHashMapImpl implements IUserDao{
private HashMap<String,User> map = new HashMap<>();
@Override
public void addUser(User user) {
// TODO Auto-generated method stub
map.put(user.getUsername(), user);
}
@Override
public void deleteUser(String username) {
// TODO Auto-generated method stub
map.remove(username);
}
@Override
public User load(String username) {
// TODO Auto-generated method stub
return map.get(username);
}
}
我们在测试的时候使用上面创建的类来代替操作真正的数据库
03.基于测试开发讲解和Cobertura框架介绍的更多相关文章
- iOS开发-常用第三方开源框架介绍
iOS开发-常用第三方开源框架介绍 图像: 1.图片浏览控件MWPhotoBrowser 实现了一个照片浏览器类似 iOS 自带的相册应用,可显示来自手机的图片或者是网络图片,可自动从网 ...
- 基于Spring开发的一个BIO-RPC框架(对新人很友好)
PART1:先来整体看下项目的构成 其中bio-rpc-core就是所谓的rpc框架 bio-rpc-example-client即所谓的服务调用方(你的项目中想要调用服务的地方) bio-rpc-e ...
- 阶段3 1.Mybatis_04.自定义Mybatis框架基于注解开发_1 今日课程内容介绍
- iOS开发-常用第三方开源框架介绍(你了解的ios只是冰山一角)--(转)
图像: 1.图片浏览控件MWPhotoBrowser 实现了一个照片浏览器类似 iOS 自带的相册应用,可显示来自手机的图片或者是网络图片,可自动从网络下载图片并进行缓存.可对图片进行缩放等操作. 下 ...
- 基于阿里云的JavaEE系统框架介绍
基于阿里云的系统框架展望 1) CDN 用于缓存静态文件等等.七牛和阿里的都还可以. 七牛要做的久一点,各种图片处理的接口要完善一些 阿里的CDN要稍微好一点点,但是没有不安全的访问方式,访问稍微没有 ...
- Android开发中用到的框架、库介绍
Android开发中用到的框架介绍,主要记录一些比较生僻的不常用的框架,不断更新中...... 网路资源:http://www.kuqin.com/shuoit/20140907/341967.htm ...
- IOS-常用第三方开源框架介绍
iOS开发-常用第三方开源框架介绍(你了解的ios只是冰山一角) 时间:2015-05-06 16:43:34 阅读:533 评论:0 收藏:0 [点我收藏+] ...
- [原创]基于SpringAOP开发的方法调用链分析框架
新人熟悉项目必备工具!基于SpringAOP开发的一款方法调用链分析插件,简单到只需要一个注解,异步非阻塞,完美嵌入Spring Cloud.Dubbo项目!再也不用担心搞不懂项目! 很多新人进入一家 ...
- 用IntelliJ IDEA 开发Spring+SpringMVC+Mybatis框架 分步搭建三:配置spring并测试
这一部分的主要目的是 配置spring-service.xml 也就是配置spring 并测试service层 是否配置成功 用IntelliJ IDEA 开发Spring+SpringMVC+M ...
随机推荐
- 分别针对Customers表与Order表的通用查询操作
1.针对customers表通用的查询操作 CustomerForQuery package com.aff.PreparedStatement; import java.lang.reflect.F ...
- Android Studio常见对话框(普通对话框、单选对话框、多选对话框、进度条对话框、消息对话框、自定义对话框)
Android Studio常见对话框(普通对话框.单选对话框.多选对话框.进度条对话框.消息对话框.自定义对话框) 1.普通对话框 2.单选对话框 3.多选对话框 4.进度条对话框 5.消息对话框 ...
- 【Storm】核心组件nimbus、supervisor、worker、executor、task
nimbus 是整个集群的控管核心,负责topology的提交.运行状态监控.任务重新分配等工作. zk就是一个管理者,监控者. 总体描述:nimbus下命令(分配任务),zk监督执行(心跳监控wor ...
- Redis 入门到分布式 (八)Redis Sentinel
个人博客网:https://wushaopei.github.io/ (你想要这里多有) sentinel-目录 主从复制高可用 安装配置 实现原理 架构说明 客户端连接 常见开发运维问题 一. ...
- Java实现 LeetCode 746 使用最小花费爬楼梯(递推)
746. 使用最小花费爬楼梯 数组的每个索引做为一个阶梯,第 i个阶梯对应着一个非负数的体力花费值 costi. 每当你爬上一个阶梯你都要花费对应的体力花费值,然后你可以选择继续爬一个阶梯或者爬两个阶 ...
- Java实现 LeetCode 724 寻找数组的中心索引(暴力)
724. 寻找数组的中心索引 给定一个整数类型的数组 nums,请编写一个能够返回数组"中心索引"的方法. 我们是这样定义数组中心索引的:数组中心索引的左侧所有元素相加的和等于右侧 ...
- Java实现 LeetCode 110 平衡二叉树
110. 平衡二叉树 给定一个二叉树,判断它是否是高度平衡的二叉树. 本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1. 示例 1: 给定二叉树 [3,9 ...
- Java 实现 蓝桥杯 等额本金
标题:等额本金 小明从银行贷款3万元.约定分24个月,以等额本金方式还款. 这种还款方式就是把贷款额度等分到24个月.每个月除了要还固定的本金外,还要还贷款余额在一个月 中产生的利息. 假设月利率是: ...
- Java实现 蓝桥杯 历届试题 波动数列
问题描述 观察这个数列: 1 3 0 2 -1 1 -2 - 这个数列中后一项总是比前一项增加2或者减少3. 栋栋对这种数列很好奇,他想知道长度为 n 和为 s 而且后一项总是比前一项增加a或者减少b ...
- Java实现 蓝桥杯 历届试题 数字游戏
问题描述 栋栋正在和同学们玩一个数字游戏. 游戏的规则是这样的:栋栋和同学们一共n个人围坐在一圈.栋栋首先说出数字1.接下来,坐在栋栋左手边的同学要说下一个数字2.再下面的一个同学要从上一个同学说的数 ...