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 ...
随机推荐
- axios发送post form请求
axios发送post form请求 只需修改url和data即可 axios({ url: '/user', method: 'post', data: { firstName: 'Fred', l ...
- ES6-函数与数组命名
1 箭头函数 1.1 以往js function 名字(){ 其他语句 } 1.2 现在ES6 修正了一些this,以前this可以变 ()=>{ 其他语句 } 如果只有一个参数,()可以省 . ...
- oracle11g数据库导入、导出操作
一.在linux系统中导入数据库. 1.linux中先输入 su - oracle下切换到oracle用户.然后以sysdba打开sqlplus:sqlplus / as sysdba 然后创建表空间 ...
- SpringCloud Netflix (六):Config 配置中心
------------恢复内容开始------------ SpringCloud Config 配置中心 Config 配置中心 Spring Cloud Config为分布式系统中的外部化配置提 ...
- Rocket - devices - DevNullDevice
https://mp.weixin.qq.com/s/rAmXl-0gDAJqWmy1R3KrlA 简单介绍DevNullDevice的实现. 1. DevNullParams DevNullPara ...
- 字符串去除空格的方式(用replace()实现)
去除所有空格: str = str.replace(/\s+/g,""); 去除两头空格: str = str.replace(/^\s+|\s+$/g,"") ...
- 【Java面试必备JVM】JVM看这篇就够了
链接–>JVM
- 我眼中的华为公有云AI平台--ModelArts
前言 AWS Sagemaker has been a great deal for most data scientists who would want to accomplish a truly ...
- Java实现九阶数独
你一定听说过"数独"游戏. 如[图1.png],玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行.每一列.每一个同色九宫内的数字均含1-9,不重复. 数独 ...
- Linux 用户和用户组管理-用户信息文件
用户信息文件存在在/etc/passwd中,vi /etc/passwd 其中,有七列以:分隔的信息 第一列表示用户(account),第二列表示密码标志(真正的密码存在在/etc/shadow中), ...