一、Junit使用步骤:
1、创建测试目录,(src、测试目录是test)
2、在测试目录test中创建与src中相同的包名
3、为需要测试的类创建测试类,例如:UsersMapper,测试类是UsersMapperTest
4、为被测试类(UsersMapper)中的需要测试的方法在测试类型创建相应的方法。比如,需要测试findById方法,那么则测试类中创建findById方法,测试方法的要求
  a、不能有返回值、不能有参数
  b、需要只用@Test注解对该方法进行注解。
5、在测试方法中,使用断言对结果进行判断,assert,判断

一。单元测试

  1. 在项目下创建一个目录test,之后将test右键Mark Directory as(标记目录为)->测试源根
  2. 在test下创建类,类的包名与被测试类的包名一致,在被测试类后面加上Test,例如:com.dao.UsersMapper与com.dao.UsersMapperTest。在测试方法前@Test,导入junit测试路径,点击确定即可,之后maven后台下载。
  3. Mybatis的核心对象:SqlSessionFactoryBuilder , SqlSessionFactory , SqlSession。(SqlSessionFactoryBuilder创建工厂,一般只用一次。SqlSessionFactory是工厂,工厂长期存在。SqlSession例如是工厂造的汽车,有时间期限,即使用完工厂依旧存在。)                                              SqlSeessionFactoryBuilder用过即丢,可用来创建多个SqlSessionFactory实例,并提供多个build方法的重载来构建SqlSessionFactory.    SqlSession(一般瞬时、短链接,也可以长连接,用完关闭)
    build(InputStream inputStream,String environment,Properties properties)
    build(Reader reader,String environment,Properties properties)
    build(Configuration config) 配置信息以三种形式提供给 SqlessionFactoryld 的build 方法:
    InputStream(字节流) Reader (字符流) Configuration (类)

    读取XML文件构造方式:

    String CONFIG_FILE = "mybatis-config.xml";
    InputStream resourceAsStream = Resources.getResourceAsStream(CONFIG_FILE);
    SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder().build(resourceAsStream);
    //非静态成员,实例成员,成员变量,通过构造方法初始化。  静态函数,成员通过静态代码块初始化
  4. 实现测试方法,在每个测试方法之前加@Test,实例化Session(建议通过工厂获取,不建议通过new获取。)写测试方法,之后进行断言操作Assert。Assert.assertNotNull(user),断言成功就是=true,断言失败,后面的代码不会执行了。eg:
     package com.dao;
    
     import com.bean.Users;
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    import org.junit.Assert;
    import org.junit.Test; import java.io.IOException;
    import java.io.InputStream; public class UsersMapperTest {
    static final String CONFIG_FILE = "mybatis-config.xml";
    static SqlSessionFactory factory;
    //非静态成员,实例成员,成员变量,通过构造方法初始化。 静态函数,成员通过静态代码块初始化
    static{ // 静态代码块
    SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
    try {
    InputStream resourceAsStream =
    Resources.getResourceAsStream(CONFIG_FILE);
    factory = builder.build(resourceAsStream);
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    @Test
    public void findById()
    {
    SqlSession session = factory.openSession();//一般通过工厂获取,不建议通过new获取。
    Users user = session.selectOne("com.dao.UsersMapper.findById", 1);
    session.close(); Assert.assertNotNull(user);
    Assert.assertEquals("管理员",user.getNickname());
    Assert.assertEquals("123",user.getPwd()); }
    }

    测试结果:

       org.apache.ibatis.logging.LogFactory     - Logging initialized using 'class org.apache.ibatis.logging.log4j.Log4jImpl' adapter.
    18 DEBUG [main] org.apache.ibatis.datasource.pooled.PooledDataSource - PooledDataSource forcefully closed/removed all connections.
    19 DEBUG [main] org.apache.ibatis.datasource.pooled.PooledDataSource - PooledDataSource forcefully closed/removed all connections.
    19 DEBUG [main] org.apache.ibatis.datasource.pooled.PooledDataSource - PooledDataSource forcefully closed/removed all connections.
    19 DEBUG [main] org.apache.ibatis.datasource.pooled.PooledDataSource - PooledDataSource forcefully closed/removed all connections.
    142 DEBUG [main] org.apache.ibatis.transaction.jdbc.JdbcTransaction - Opening JDBC Connection
    531 DEBUG [main] org.apache.ibatis.datasource.pooled.PooledDataSource - Created connection 558187323.
    534 DEBUG [main] com.dao.UsersMapper.findById - ooo Using Connection [com.mysql.cj.jdbc.ConnectionImpl@2145433b]
    535 DEBUG [main] com.dao.UsersMapper.findById - ==> Preparing: select id,nickname,realname,pwd,phone,email,address,create_time createTime,type,realid from n_users where id = ?
    582 DEBUG [main] com.dao.UsersMapper.findById - ==> Parameters: 1(Integer)
    628 TRACE [main] com.dao.UsersMapper.findById - <== Columns: id, nickname, realname, pwd, phone, email, address, createTime, type, realid
    628 TRACE [main] com.dao.UsersMapper.findById - <== Row: 1, 管理员, null, 123, null, null, null, 2019-10-09 10:06:39, 0, null
    633 DEBUG [main] org.apache.ibatis.transaction.jdbc.JdbcTransaction - Resetting autocommit to true on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@2145433b]
    633 DEBUG [main] org.apache.ibatis.transaction.jdbc.JdbcTransaction - Closing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@2145433b]
    633 DEBUG [main] org.apache.ibatis.datasource.pooled.PooledDataSource - Returned connection 558187323 to pool. 进程完成,退出码 0

    到此单元测试就完成了,接下来是一个完整的代码。

  5. 单元测试总结代码:
     package com.dao;
    
     import com.bean.Users;
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    import org.junit.Assert;
    import org.junit.Test; import java.io.IOException;
    import java.io.InputStream;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    import java.util.List;
    import java.util.Date;
    public class UsersMapperTest {
    static final String CONFIG_FILE = "mybatis-config.xml";
    static SqlSessionFactory factory;
    static{ // 静态代码块
    SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
    try {
    InputStream resourceAsStream =
    Resources.getResourceAsStream(CONFIG_FILE);
    factory = builder.build(resourceAsStream);
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    @Test // Alt+enter
    public void findById(){
    SqlSession session = factory.openSession();
    Users user = session.selectOne("com.dao.UsersMapper.findById", 1);
    // 手工的、肉眼的、主观的、人品的方式判断程序的成熟度
    System.out.println();// TRACE/DEBUG/INFO/ERROR
    // 自动的、断言的、客观的、量化的方式判断程序的成熟度
    Assert.assertNotNull(user);
    Assert.assertEquals("管理员",user.getNickname());
    Assert.assertEquals("123",user.getPwd());
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String date = df.format(user.getCreateTime());
    Assert.assertEquals("2019-10-09 10:06:39",date);
    }
    @Test
    public void findAll(){
    SqlSession session = factory.openSession();
    List<Users> list = session.selectList("com.dao.UsersMapper.findAll");
    Assert.assertNotNull(list);
    Assert.assertEquals(3,list.size());<!--!验证表里记录条数-->
    Assert.assertEquals("管理员",list.get(0).getNickname());
    }
    @Test
    public void add(){
    Users user = new Users();
    user.setNickname("zhaoliu");
    user.setRealname("赵六");
    user.setPhone("11111");
    user.setEmail("11111@111.com");
    user.setAddress("111");
    user.setPwd("123");
    user.setCreateTime(new java.util.Date());
    SqlSession session = factory.openSession();
    session.insert("com.dao.UsersMapper.add",user);
    session.commit(); <!--!提交事务-->
    Users userDb = session.selectOne("com.dao.UsersMapper.findById",6); <!--!id以实际为准-->
    Assert.assertNotNull(userDb);
    Assert.assertEquals("赵六",userDb.getRealname());
    session.close();
    }
    @Test
    public void update() throws ParseException {
    SqlSession session = factory.openSession();
    Users dbUser = session.selectOne("com.dao.UsersMapper.findById",6);
    Assert.assertNotNull(dbUser);
    dbUser.setNickname("zhaoliu");
    // 2020-03-03 14:13:23 => 2019-10-09 10:11:42 : 2种
    /*Calendar cl = Calendar.getInstance(); // 当前时间
    cl.set(Calendar.YEAR,2019);
    cl.set(Calendar.MONTH,9); // 0-11
    cl.set(Calendar.DAY_OF_MONTH,9); // 1-31
    cl.set(Calendar.HOUR_OF_DAY,10); // 0-23
    cl.set(Calendar.MINUTE,11); // 1-60
    cl.set(Calendar.SECOND,42); // 1-60
    cl.set(Calendar.MILLISECOND,0); Date date=cl.getTime();*/
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Date date = df.parse("2020-10-09 10:11:43"); //常用于判断从网络接受的时间
    dbUser.setCreateTime(date);
    session.update("com.dao.UsersMapper.update",dbUser);
    session.commit();
    Users user = session.selectOne("com.dao.UsersMapper.findById",6);
    Assert.assertNotNull(user);
    Assert.assertEquals("zhaoliu",user.getNickname());
    Assert.assertEquals(date,user.getCreateTime());
    }
    @Test
    public void delete(){
    // hibernate,mybatis
    // 主从表/父子表的概念?主表-主键所在的表,从表-外键所在的表
    // 1、添加数据:先为主表添加数据,后为从表添加数据
    // 2、删除数据:先删除从表数据,然后删除主表数据
    // n_users (主表) 的从表:n_news,n_replys,n_short_replys,n_access_logs
    // a主->b从->c从->d从,不创建外键(外键关系是存在的)
    SqlSession session = factory.openSession();
    session.delete("com.dao.AccessLogsMapper.deleteByUsersId",6);
    session.delete("com.dao.ShortReplysMapper.deleteByUsersId",6);
    session.delete("com.dao.ReplysMapper.deleteByUsersId",6);
    session.delete("com.dao.NewsMapper.deleteByUsersId",6);
    session.delete("com.dao.UsersMapper.delete",6);
    session.commit();
    Users user = session.selectOne("com.dao.UsersMapper.findById",6);
    Assert.assertNull(user);
    }
    }

    在执行删除操作时,记得删除外键里的记录,后删除主键内的记录。    // 主从表/父子表的概念?主表-主键所在的表,从表-外键所在的表
    101         // 1、添加数据:先为主表添加数据,后为从表添加数据
    102         // 2、删除数据:先删除从表数据,然后删除主表数据
    103         // n_users (主表) 的从表:n_news,n_replys,n_short_replys,n_access_logs
    104         // a主->b从->c从->d从,不创建外键(外键关系是存在的)

  6. 之后依次把实体类,实现Mapper,并在主配置文件中配置,Mapper。
  7. 学会审视自己的代码,=》审查(语法错误,逻辑错误)、优化、重构。

(2).mybatis单元测试(junit测试)的更多相关文章

  1. 单元测试实战 - Junit测试

    一.对加法函数进行测试 1.实例化被测单元(方法):类名 实例名=new 类名([参数]) 2.调用被测单元,对比预期值和输出值(实际值): 在没有junit测试工具的情况下,我们要进行如下的测试代码 ...

  2. spring && Cobertura && maven &&junit 单元测试以及测试覆盖率

    1. 目的:       junit 单元测试,Cobertura   测试覆盖率报告       项目目录结构          2. maven 配置     <project xmlns= ...

  3. Struts2+Spring+Mybatis+Junit 测试

    Struts2+Spring+Mybatis+Junit 测试 博客分类: HtmlUnit Junit Spring 测试 Mybatis  package com.action.kioskmoni ...

  4. Junit测试Controller(MockMVC使用),传输@RequestBody数据解决办法

    一.单元测试的目的 简单来说就是在我们增加或者改动一些代码以后对所有逻辑的一个检测,尤其是在我们后期修改后(不论是增加新功能,修改bug),都可以做到重新测试的工作.以减少我们在发布的时候出现更过甚至 ...

  5. Android Junit测试框架

    对应用进行单元测试: 使用Junit测试框架,是正规Android开发的必用技术.在Junit中可以得到组件,可以模拟发送事件和检测程序处理的正确性. 1.配置指令集和函数库: (1)配置指令集,指定 ...

  6. 无废话Android之android下junit测试框架配置、保存文件到手机内存、android下文件访问的权限、保存文件到SD卡、获取SD卡大小、使用SharedPreferences进行数据存储、使用Pull解析器操作XML文件、android下操作sqlite数据库和事务(2)

    1.android下junit测试框架配置 单元测试需要在手机中进行安装测试 (1).在清单文件中manifest节点下配置如下节点 <instrumentation android:name= ...

  7. Junit测试中的setup和teardown 和 @before 和 @After 方法

    这几天做Junit测试接触到了setup和teardown两个方法,简单的可以这样理解它们,setup主要实现测试前的初始化工作,而teardown则主要实现测试完成后的垃圾回收等工作. 需要注意的是 ...

  8. springmvc controller junit 测试

    第一次搭建SSM框架,整合SpringMVC完成后进行Controller测试,找资料并解决问题. 下图是我的完整目录: 1 建立UserController类 代码清单 1-1:UserContro ...

  9. Android:单元测试Junit的配置

    在实际开发中,开发android软件的过程需要不断地进行测试.而使用Junit测试框架,侧是正规Android开发的必用技术,在Junit中可以得到组件,可以模拟发送事件和检测程序处理的正确性.... ...

随机推荐

  1. Eureka源码分析

    源码流程图 先上图,不太清晰,抱歉 一.Eureka Server源码分析 从@EnableEurekaServer注解为入口,它是一个标记注解,点进去看 注解内容如下 /** * 激活Eureka服 ...

  2. MySQL使用mysqldump+binlog完整恢复被删除的数据库

    (一)概述 在日常的MySQL数据库运维过程中,可能会遇到用户误删除数据,常见的误删除数据操作有: 用户执行delete,因为条件不对,删除了不应该删除的数据(DML操作): 用户执行update,因 ...

  3. 散列表和JAVA中的hash

    引文 hello,今天写的数据结构是散列表(hash表),也算是一种基础数据结构了吧.学过计算机的人大概都能说出来这是个以空间换时间的东西,那么具体怎么实现的是今天要讨论的问题. 为什么需要它?主要还 ...

  4. Java Web教程——检视阅读

    Java Web教程--检视阅读 参考 java web入门--概念理解.名词解释 Java Web 教程--w3school 蓝本 JavaWeb学习总结(一)--JavaWeb开发入门 小猴子mo ...

  5. 5. 配置项:rule_files

    prometheus配置文件内容: global: # 默认情况下抓取目标的频率. [ scrape_interval: <duration> | default = 1m ] # 抓取超 ...

  6. 开发机直连 Docker 中的 Redis 容器小教程

    在笔者日常开发中,都是把redis装在windows系统中.虽然可以通过RedisDesktopManager等客户端工具连接操作redis,但是还是觉得low了一些.因为作为程序员,我可能更想在Li ...

  7. 0day学习笔记(3)--修改函数返回地址

    环境: devc++(编译改为32位),windows10 源码(来自书中) #include <stdio.h> #define PASSWORD "1234567" ...

  8. php 全局变量和超全局变量

    global 全局变量(在当前页面全部地方有效) $GLOBALS['name'] 超全局变量(在整个网站全部地方有效) 一个包含了全部变量的全局组合数组.变量的名字就是数组的键.还有_GET,_PO ...

  9. 关于vagrant环境下项目中图片缓存的问题

    之前用的是iis所以可能没有这些问题,后来换了nginx之后发现图片缓存问题很严重,本项目用的是thinkphp5框架:浏览器.runtime.session.cookie.加参数,后台,所有缓存都清 ...

  10. python学习24之异常

    '''''''''1.低级错误:纯语法错误2.中级错误:代码存在隐性错误,逻辑缺陷3.高级错误:软件面对不确定性的异常错误''''''一.捕获异常1.基本异常捕获语句try: #异常捕捉语句的开始 代 ...