(2).mybatis單元測試(junit測試)


 

一、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:
     1 package com.dao;
     2 
     3 import com.bean.Users;
     4 import org.apache.ibatis.io.Resources;
     5 import org.apache.ibatis.session.SqlSession;
     6 import org.apache.ibatis.session.SqlSessionFactory;
     7 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
     8 import org.junit.Assert;
     9 import org.junit.Test;
    10 
    11 import java.io.IOException;
    12 import java.io.InputStream;
    13 
    14 public class UsersMapperTest {
    15     static final String CONFIG_FILE = "mybatis-config.xml";
    16     static SqlSessionFactory factory;
    17     //非靜態成員,實例成員,成員變量,通過構造方法初始化。  靜態函數,成員通過靜態代碼塊初始化
    18     static{  // 靜態代碼塊
    19         SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
    20         try {
    21             InputStream resourceAsStream =
    22                     Resources.getResourceAsStream(CONFIG_FILE);
    23             factory = builder.build(resourceAsStream);
    24         } catch (IOException e) {
    25             e.printStackTrace();
    26         }
    27     }
    28     @Test
    29     public void findById()
    30     {
    31         SqlSession session = factory.openSession();//一般通過工廠獲取,不建議通過new獲取。
    32         Users user = session.selectOne("com.dao.UsersMapper.findById", 1);
    33         session.close();
    34 
    35         Assert.assertNotNull(user);
    36         Assert.assertEquals("管理員",user.getNickname());
    37         Assert.assertEquals("123",user.getPwd());
    38 
    39     }
    40 }

    測試結果:

     1   org.apache.ibatis.logging.LogFactory     - Logging initialized using 'class org.apache.ibatis.logging.log4j.Log4jImpl' adapter.
     2 18   DEBUG [main] org.apache.ibatis.datasource.pooled.PooledDataSource     - PooledDataSource forcefully closed/removed all connections.
     3 19   DEBUG [main] org.apache.ibatis.datasource.pooled.PooledDataSource     - PooledDataSource forcefully closed/removed all connections.
     4 19   DEBUG [main] org.apache.ibatis.datasource.pooled.PooledDataSource     - PooledDataSource forcefully closed/removed all connections.
     5 19   DEBUG [main] org.apache.ibatis.datasource.pooled.PooledDataSource     - PooledDataSource forcefully closed/removed all connections.
     6 142  DEBUG [main] org.apache.ibatis.transaction.jdbc.JdbcTransaction     - Opening JDBC Connection
     7 531  DEBUG [main] org.apache.ibatis.datasource.pooled.PooledDataSource     - Created connection 558187323.
     8 534  DEBUG [main]          com.dao.UsersMapper.findById     - ooo Using Connection [com.mysql.cj.jdbc.ConnectionImpl@2145433b]
     9 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 = ? 
    10 582  DEBUG [main]          com.dao.UsersMapper.findById     - ==> Parameters: 1(Integer)
    11 628  TRACE [main]          com.dao.UsersMapper.findById     - <==    Columns: id, nickname, realname, pwd, phone, email, address, createTime, type, realid
    12 628  TRACE [main]          com.dao.UsersMapper.findById     - <==        Row: 1, 管理員, null, 123, null, null, null, 2019-10-09 10:06:39, 0, null
    13 633  DEBUG [main] org.apache.ibatis.transaction.jdbc.JdbcTransaction     - Resetting autocommit to true on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@2145433b]
    14 633  DEBUG [main] org.apache.ibatis.transaction.jdbc.JdbcTransaction     - Closing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@2145433b]
    15 633  DEBUG [main] org.apache.ibatis.datasource.pooled.PooledDataSource     - Returned connection 558187323 to pool.
    16 
    17 進程完成,退出碼 0

     到此單元測試就完成了,接下來是一個完整的代碼。

  5. 單元測試總結代碼:
      1 package com.dao;
      2 
      3 import com.bean.Users;
      4 import org.apache.ibatis.io.Resources;
      5 import org.apache.ibatis.session.SqlSession;
      6 import org.apache.ibatis.session.SqlSessionFactory;
      7 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
      8 import org.junit.Assert;
      9 import org.junit.Test;
     10 
     11 import java.io.IOException;
     12 import java.io.InputStream;
     13 import java.text.ParseException;
     14 import java.text.SimpleDateFormat;
     15 import java.util.Calendar;
     16 import java.util.List;
     17 import java.util.Date;
     18 public class UsersMapperTest {
     19     static final String CONFIG_FILE = "mybatis-config.xml";
     20     static SqlSessionFactory factory;
     21     static{  // 靜態代碼塊
     22         SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
     23         try {
     24             InputStream resourceAsStream =
     25                     Resources.getResourceAsStream(CONFIG_FILE);
     26             factory = builder.build(resourceAsStream);
     27         } catch (IOException e) {
     28             e.printStackTrace();
     29         }
     30     }
     31     @Test   // Alt+enter
     32     public void findById(){
     33         SqlSession session = factory.openSession();
     34         Users user = session.selectOne("com.dao.UsersMapper.findById", 1);
     35         // 手工的、肉眼的、主觀的、人品的方式判斷程序的成熟度
     36         System.out.println();// TRACE/DEBUG/INFO/ERROR
     37         // 自動的、斷言的、客觀的、量化的方式判斷程序的成熟度
     38         Assert.assertNotNull(user);
     39         Assert.assertEquals("管理員",user.getNickname());
     40         Assert.assertEquals("123",user.getPwd());
     41         SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
     42         String date = df.format(user.getCreateTime());
     43         Assert.assertEquals("2019-10-09 10:06:39",date);
     44     }
     45     @Test
     46     public void findAll(){
     47         SqlSession session = factory.openSession();
     48         List<Users> list = session.selectList("com.dao.UsersMapper.findAll");
     49         Assert.assertNotNull(list);
     50         Assert.assertEquals(3,list.size());<!--!驗證表里記錄條數-->
     52         Assert.assertEquals("管理員",list.get(0).getNickname());
     53     }
     54     @Test
     55     public void add(){
     56         Users user = new Users();
     57         user.setNickname("zhaoliu");
     58         user.setRealname("趙六");
     59         user.setPhone("11111");
     60         user.setEmail("11111@111.com");
     61         user.setAddress("111");
     62         user.setPwd("123");
     63         user.setCreateTime(new java.util.Date());
     64         SqlSession session = factory.openSession();
     65         session.insert("com.dao.UsersMapper.add",user);
     66         session.commit();                                                         <!--!提交事務-->
     67         Users userDb = session.selectOne("com.dao.UsersMapper.findById",6);      <!--!id以實際為准-->
     68         Assert.assertNotNull(userDb);
     69         Assert.assertEquals("趙六",userDb.getRealname());
     70         session.close();
     71     }
     72     @Test
     73     public void update() throws ParseException {
     74         SqlSession session = factory.openSession();
     75         Users dbUser = session.selectOne("com.dao.UsersMapper.findById",6);
     76         Assert.assertNotNull(dbUser);
     77         dbUser.setNickname("zhaoliu");
     78         // 2020-03-03 14:13:23 => 2019-10-09 10:11:42 : 2種
     79         /*Calendar cl = Calendar.getInstance(); // 當前時間
     80         cl.set(Calendar.YEAR,2019);
     81         cl.set(Calendar.MONTH,9);   // 0-11
     82         cl.set(Calendar.DAY_OF_MONTH,9);  // 1-31
     83         cl.set(Calendar.HOUR_OF_DAY,10);  // 0-23
     84         cl.set(Calendar.MINUTE,11);     // 1-60
     85         cl.set(Calendar.SECOND,42);     // 1-60
     86         cl.set(Calendar.MILLISECOND,0);  Date date=cl.getTime();*/
     87         SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
     88         Date date = df.parse("2020-10-09 10:11:43");    //常用於判斷從網絡接受的時間
     89         dbUser.setCreateTime(date);
     90         session.update("com.dao.UsersMapper.update",dbUser);
     91         session.commit();
     92         Users user = session.selectOne("com.dao.UsersMapper.findById",6);
     93         Assert.assertNotNull(user);
     94         Assert.assertEquals("zhaoliu",user.getNickname());
     95         Assert.assertEquals(date,user.getCreateTime());
     96     }
     97     @Test
     98     public void delete(){
     99         // hibernate,mybatis
    100         // 主從表/父子表的概念?主表-主鍵所在的表,從表-外鍵所在的表
    101         // 1、添加數據:先為主表添加數據,后為從表添加數據
    102         // 2、刪除數據:先刪除從表數據,然后刪除主表數據
    103         // n_users (主表) 的從表:n_news,n_replys,n_short_replys,n_access_logs
    104         // a主->b從->c從->d從,不創建外鍵(外鍵關系是存在的)
    105         SqlSession session = factory.openSession();
    106         session.delete("com.dao.AccessLogsMapper.deleteByUsersId",6);
    107         session.delete("com.dao.ShortReplysMapper.deleteByUsersId",6);
    108         session.delete("com.dao.ReplysMapper.deleteByUsersId",6);
    109         session.delete("com.dao.NewsMapper.deleteByUsersId",6);
    110         session.delete("com.dao.UsersMapper.delete",6);
    111         session.commit();
    112         Users user = session.selectOne("com.dao.UsersMapper.findById",6);
    113         Assert.assertNull(user);
    114     }
    115 }

     在執行刪除操作時,記得刪除外鍵里的記錄,后刪除主鍵內的記錄。    // 主從表/父子表的概念?主表-主鍵所在的表,從表-外鍵所在的表
    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. 學會審視自己的代碼,=》審查(語法錯誤,邏輯錯誤)、優化、重構。
  8. 增加方法:@Before:是表示在每一個測試方法執行前,都會調用該方法。
  9. 增加方法:@BeforeClass:是表示在多個單元測試方法中,無論有多少個測試方法,都只執行一次。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM