首先我们先

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框架介绍的更多相关文章

  1. iOS开发-常用第三方开源框架介绍

    iOS开发-常用第三方开源框架介绍 图像: 1.图片浏览控件MWPhotoBrowser        实现了一个照片浏览器类似 iOS 自带的相册应用,可显示来自手机的图片或者是网络图片,可自动从网 ...

  2. 基于Spring开发的一个BIO-RPC框架(对新人很友好)

    PART1:先来整体看下项目的构成 其中bio-rpc-core就是所谓的rpc框架 bio-rpc-example-client即所谓的服务调用方(你的项目中想要调用服务的地方) bio-rpc-e ...

  3. 阶段3 1.Mybatis_04.自定义Mybatis框架基于注解开发_1 今日课程内容介绍

  4. iOS开发-常用第三方开源框架介绍(你了解的ios只是冰山一角)--(转)

    图像: 1.图片浏览控件MWPhotoBrowser 实现了一个照片浏览器类似 iOS 自带的相册应用,可显示来自手机的图片或者是网络图片,可自动从网络下载图片并进行缓存.可对图片进行缩放等操作. 下 ...

  5. 基于阿里云的JavaEE系统框架介绍

    基于阿里云的系统框架展望 1) CDN 用于缓存静态文件等等.七牛和阿里的都还可以. 七牛要做的久一点,各种图片处理的接口要完善一些 阿里的CDN要稍微好一点点,但是没有不安全的访问方式,访问稍微没有 ...

  6. Android开发中用到的框架、库介绍

    Android开发中用到的框架介绍,主要记录一些比较生僻的不常用的框架,不断更新中...... 网路资源:http://www.kuqin.com/shuoit/20140907/341967.htm ...

  7. IOS-常用第三方开源框架介绍

    iOS开发-常用第三方开源框架介绍(你了解的ios只是冰山一角) 时间:2015-05-06 16:43:34      阅读:533      评论:0      收藏:0      [点我收藏+] ...

  8. [原创]基于SpringAOP开发的方法调用链分析框架

    新人熟悉项目必备工具!基于SpringAOP开发的一款方法调用链分析插件,简单到只需要一个注解,异步非阻塞,完美嵌入Spring Cloud.Dubbo项目!再也不用担心搞不懂项目! 很多新人进入一家 ...

  9. 用IntelliJ IDEA 开发Spring+SpringMVC+Mybatis框架 分步搭建三:配置spring并测试

    这一部分的主要目的是 配置spring-service.xml  也就是配置spring  并测试service层 是否配置成功 用IntelliJ IDEA 开发Spring+SpringMVC+M ...

随机推荐

  1. 深入浅出Spring MVC

    摘要 本文旨在详细分析SpringMVC工作原理以及作为开发者如何基于SpringMVC做扩展.因为SpringMVC分析的文章比较多,所以本文重点讲解如何利用SpringMVC的扩展点实现我们的需求 ...

  2. PowerPC-关闭中断后,还能报sc中断?

    https://mp.weixin.qq.com/s/OsHIfPzYUagaTe5J88dIIg   一. 基本问题   FreeRTOS有一个宏,portYIELD_WITHIN_API(), 意 ...

  3. SpringCloud Eureka Client和Server侧配置及Eureka高可用配置

    一.Eureka注册中心和客户端配置Demo. 1.Server端 a.使用Idea创建Spring项目,如下所示: b.相关配置 application.yaml配置文件如下: # eureka本身 ...

  4. 数据库之 MySQL --- 下载、安装 及 概述(一)

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一 . MySql数据库的安装 1.图解MySQL程序结构 ​ 2.双击运行安装程序:以Win32位为例 ...

  5. Java实现 LeetCode 999 车的可用捕获量(简单搜索)

    999. 车的可用捕获量 在一个 8 x 8 的棋盘上,有一个白色车(rook).也可能有空方块,白色的象(bishop)和黑色的卒(pawn).它们分别以字符 "R"," ...

  6. 第四届蓝桥杯JavaC组省赛真题

    解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.猜年龄 题目描述 美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学.他曾在1935~1936年应邀来中国清华大学讲学. 一 ...

  7. 第七届蓝桥杯JavaC组省赛真题

    解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.有奖竞猜 题目描述 小明很喜欢猜谜语. 最近,他被邀请参加了X星球的猜谜活动. 每位选手开始的时候都被发给777个电子币. 规则是:猜 ...

  8. Java实现 洛谷 P2089 烤鸡

    import java.util.Arrays; import java.util.Iterator; import java.util.LinkedList; import java.util.Sc ...

  9. 【Mysql】使用一条sql查询出库表结构信息

    1.新建查询 将以下脚本粘贴进去 脚本如下: SELECT TABLE_SCHEMA 库名, TABLE_NAME 表名, COLUMN_NAME 列名, COLUMN_TYPE 数据类型, DATA ...

  10. 汇编指令:push、pop

    8086CPU出栈入栈都是以字为单位进行的. push ax 由一下两步完成 1.SP=SP-2 2.将ax中的内容送入SS:SP指向的内存单元 pop ax 1.将SS:SP指向的内存单元中的内容送 ...