一、Junit使用步驟:
1、創建測試目錄,(src、測試目錄是test)
2、在測試目錄test中創建與src中相同的包名
3、為需要測試的類創建測試類,例如:UsersMapper,測試類是UsersMapperTest
4、為被測試類(UsersMapper)中的需要測試的方法在測試類型創建相應的方法。比如,需要測試findById方法,那么則測試類中創建findById方法,測試方法的要求
a、不能有返回值、不能有參數
b、需要只用@Test注解對該方法進行注解。
5、在測試方法中,使用斷言對結果進行判斷,assert,判斷
一。單元測試
- 在項目下創建一個目錄test,之后將test右鍵Mark Directory as(標記目錄為)->測試源根
- 在test下創建類,類的包名與被測試類的包名一致,在被測試類后面加上Test,例如:com.dao.UsersMapper與com.dao.UsersMapperTest。在測試方法前@Test,導入junit測試路徑,點擊確定即可,之后maven后台下載。

- 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);
//非靜態成員,實例成員,成員變量,通過構造方法初始化。 靜態函數,成員通過靜態代碼塊初始化
- 實現測試方法,在每個測試方法之前加@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
到此單元測試就完成了,接下來是一個完整的代碼。
- 單元測試總結代碼:
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從,不創建外鍵(外鍵關系是存在的) - 之后依次把實體類,實現Mapper,並在主配置文件中配置,Mapper。
- 學會審視自己的代碼,=》審查(語法錯誤,邏輯錯誤)、優化、重構。
- 增加方法:@Before:是表示在每一個測試方法執行前,都會調用該方法。
- 增加方法:@BeforeClass:是表示在多個單元測試方法中,無論有多少個測試方法,都只執行一次。
