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 ...
随机推荐
- 二维DCT变换 | Python实现
引言 最近专业课在学信息隐藏与数字水印,上到了变换域隐藏技术,提到了其中的DCT变换,遂布置了一个巨烦人的作业,让手动给两个\(8\times8\)的矩阵做二维DCT变换,在苦逼的算了一小时后,我决定 ...
- MySql轻松入门系列————第一站 从源码角度轻松认识mysql整体框架图
一:背景 1. 讲故事 最近看各大技术社区,不管是知乎,掘金,博客园,csdn基本上看不到有小伙伴分享sqlserver类的文章,看样子这些年sqlserver没落了,已经后继无人了,再写sqlser ...
- Beta冲刺——5.26
这个作业属于哪个课程 软件工程 这个作业要求在哪里 Beta冲刺 这个作业的目标 Beta冲刺 作业正文 正文 github链接 项目地址 其他参考文献 无 一.会议内容 1.组员一起学习Git分支管 ...
- Rocket - diplomacy - DUEB参数模型分析
https://mp.weixin.qq.com/s/533bJxcPRgO4W2gf_OEhEw 分析DUEB参数模型中各种参数类型的可能性. 1. 节点类型 根据参数的传播方向,可 ...
- xss(跨站脚本攻击)
xss(跨站脚本攻击) 原理:攻击者可以通过在页面中注入恶意链接或者脚本代码,当受害者访问时,脚本代码会在其浏览器中执行,这个时候,我们可以获取当前用户的cookie或者进行重定向等操作. xss造成 ...
- 利用mitmproxy实现抖音Cookie,设备ID获取(一)
先讲解一下思路,是利用mitmproxy代理https协议,从而判定抖音个人信息接口,在个人信息接口的返回体接收时将用户信息数据,以及Header头(主要是Cookie),Query体(包含设备ID) ...
- AS中将module转成library的步骤
转换步骤是在Android Studio 2.3版本下进行的,其他版本未测试 将要变成library的module的gradle文件的第一行 修改前:apply plugin: 'com.Androi ...
- Nice Jquery Validator 事件
订阅 .on("validation") 描述:每次验证完一个字段,都会触发 validation 事件,通过该事件可以获取到当前验证字段的验证结果. 示例: $('#form') ...
- 【转载】自动化魔方求解器的Bug——选择合适的色彩空间
目录 1. 准备工作-- 2. RGB颜色空间 3. LAB色彩空间 4. YCrCb色彩空间 5. HSV色彩空间 Color spaces in OpenCV (C++ / Python) 几天前 ...
- 安装并配置Samba
1. 安装 samba ~$sudo apt-get install samba 2. 修改 samba 的配置文件 ~$sudo gedit /etc/samba/smb.conf 添加如下内容 [ ...