(2).mybatis单元测试(junit测试)
⼀、Junit使⽤步骤:
1、创建测试⽬录,(src、测试⽬录是test)
2、在测试⽬录test中创建与src中相同的包名
3、为需要测试的类创建测试类,例如:UrsMapper,测试类是UrsMapperTest
4、为被测试类(UrsMapper)中的需要测试的⽅法在测试类型创建相应的⽅法。⽐如,需要测试findById⽅法,那么则测试类中创建findById⽅法,测试⽅法的要求
a、不能有返回值、不能有参数
b、需要只⽤@Test注解对该⽅法进⾏注解。
5、在测试⽅法中,使⽤断⾔对结果进⾏判断,asrt,判断
⼀。单元测试
1. 在项⽬下创建⼀个⽬录test,之后将test右键Mark Directory as(标记⽬录为)->测试源根
2. 在test下创建类,类的包名与被测试类的包名⼀致,在被测试类后⾯加上Test,例如:com.dao.UrsMapper与
com.dao.UrsMapperTest。在测试⽅法前@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 = "l";
InputStream resourceAsStream = ResourceAsStream(CONFIG_FILE);
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder().build(resourceAsStream);
//⾮静态成员,实例成员,成员变量,通过构造⽅法初始化。静态函数,成员通过静态代码块初始化
4. 实现测试⽅法,在每个测试⽅法之前加@Test,实例化Session(建议通过⼯⼚获取,不建议通过new获取。)写测试⽅法,之后进⾏断
⾔操作Asrt。Asrt.asrtNotNull(ur),断⾔成功就是=true,断⾔失败,后⾯的代码不会执⾏了。eg:
1package com.dao;
2
3import com.bean.Urs;
4import org.apache.ibatis.io.Resources;
5import org.apache.ibatis.ssion.SqlSession;
6import org.apache.ibatis.ssion.SqlSessionFactory;
7import org.apache.ibatis.ssion.SqlSessionFactoryBuilder;
8import org.junit.Asrt;
9import org.junit.Test;
10
11import java.io.IOException;
12import java.io.InputStream;
13
14public class UrsMapperTest {
15static final String CONFIG_FILE = "l";
16static SqlSessionFactory factory;
17//⾮静态成员,实例成员,成员变量,通过构造⽅法初始化。静态函数,成员通过静态代码块初始化
18static{ // 静态代码块
19 SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
20try {
21 InputStream resourceAsStream =
22 ResourceAsStream(CONFIG_FILE);
23 factory = builder.build(resourceAsStream);
24 } catch (IOException e) {
25 e.printStackTrace();
26 }
27 }
28 @Test
29public void findById()
30 {
31 SqlSession ssion = factory.openSession();//⼀般通过⼯⼚获取,不建议通过new获取。
32 Urs ur = ssion.lectOne("com.dao.UrsMapper.findById", 1);
33 ssion.clo();
34
35 Asrt.asrtNotNull(ur);
36 Asrt.asrtEquals("管理员",ur.getNickname());
37 Asrt.asrtEquals("123",ur.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 clod/removed all connections.
3 19 DEBUG [main] org.apache.ibatis.datasource.pooled.PooledDataSource - PooledDataSource forcefully clod/removed all connections.
4 19 DEBUG [main] org.apache.ibatis.datasource.pooled.PooledDataSource - PooledDataSource forcefully clod/removed all connections.
5 19 DEBUG [main] org.apache.ibatis.datasource.pooled.PooledDataSource - PooledDataSource forcefully clod/removed all connections.
6 142 DEBUG [main] org.ansaction.jdbc.JdbcTransaction - Opening JDBC Connection
7 531 DEBUG [main] org.apache.ibatis.datasource.pooled.PooledDataSource - Created connection 558187323.
8 534 DEBUG [main] com.dao.UrsMapper.findById - ooo Using Connection [sql.cj.jdbc.ConnectionImpl@2145433b]
9 535 DEBUG [main] com.dao.UrsMapper.findById - ==> Preparing: lect id,nickname,realname,pwd,phone,email,address,create_time
createTime,type,realid from n_urs where id = ?
10 582 DEBUG [main] com.dao.UrsMapper.findById - ==> Parameters: 1(Integer)
11 628 TRACE [main] com.dao.UrsMapper.findById - <== Columns: id, nickname, realname, pwd, phone, email, address, createTime,
type, realid
12 628 TRACE [main] com.dao.UrsMapper.findById - <== Row: 1, 管理员, null, 123, null, null, null, 2019-10-09 10:06:39, 0, null
13 633 DEBUG [main] org.ansaction.jdbc.JdbcTransaction - Retting autocommit to true on JDBC Connection
[sql.cj.jdbc.ConnectionImpl@2145433b]
14 633 DEBUG [main] org.ansaction.jdbc.JdbcTransaction - Closing JDBC Connection
[sql.cj.jdbc.ConnectionImpl@2145433b]
15 633 DEBUG [main] org.apache.ibatis.datasource.pooled.PooledDataSource - Returned connection 558187323 to pool.
16
17进程完成,退出码 0
到此单元测试就完成了,接下来是⼀个完整的代码。
5. 单元测试总结代码:
1package com.dao;
2
3import com.bean.Urs;
4import org.apache.ibatis.io.Resources;
5import org.apache.ibatis.ssion.SqlSession;
6import org.apache.ibatis.ssion.SqlSessionFactory;
7import org.apache.ibatis.ssion.SqlSessionFactoryBuilder;
8import org.junit.Asrt;
9import org.junit.Test;
10
11import java.io.IOException;
12import java.io.InputStream;
ParException;
SimpleDateFormat;
15import java.util.Calendar;
16import java.util.List;
17import java.util.Date;
18public class UrsMapperTest {
19static final String CONFIG_FILE = "l";
20static SqlSessionFactory factory;
21static{ // 静态代码块
22 SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
23try {
24 InputStream resourceAsStream =
25 ResourceAsStream(CONFIG_FILE);
26 factory = builder.build(resourceAsStream);
27 } catch (IOException e) {
28 e.printStackTrace();
29 }
30 }
31 @Test // Alt+enter
32public void findById(){
33 SqlSession ssion = factory.openSession();
34 Urs ur = ssion.lectOne("com.dao.UrsMapper.findById", 1);
35// ⼿⼯的、⾁眼的、主观的、⼈品的⽅式判断程序的成熟度
36 System.out.println();// TRACE/DEBUG/INFO/ERROR
37// ⾃动的、断⾔的、客观的、量化的⽅式判断程序的成熟度
38 Asrt.asrtNotNull(ur);
39 Asrt.asrtEquals("管理员",ur.getNickname());
40 Asrt.asrtEquals("123",ur.getPwd());
41 SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
42 String date = df.CreateTime());
43 Asrt.asrtEquals("2019-10-09 10:06:39",date);
44 }
45 @Test
46public void findAll(){
47 SqlSession ssion = factory.openSession();
48 List<Urs> list = ssion.lectList("com.dao.UrsMapper.findAll");
49 Asrt.asrtNotNull(list);
50 Asrt.asrtEquals(3,list.size());<!--!验证表⾥记录条数-->
52 Asrt.asrtEquals("管理员",(0).getNickname());
53 }
54 @Test
55public void add(){
56 Urs ur = new Urs();
57 ur.tNickname("zhaoliu");
58 ur.tRealname("赵六");
59 ur.tPhone("11111");
60 ur.tEmail("");
61 ur.tAddress("111");
62 ur.tPwd("123");
63 ur.tCreateTime(new java.util.Date());
64 SqlSession ssion = factory.openSession();
65 ssion.inrt("com.dao.UrsMapper.add",ur);
66 it(); <!--!提交事务-->
67 Urs urDb = ssion.lectOne("com.dao.UrsMapper.findById",6); <!--!id以实际为准-->
68 Asrt.asrtNotNull(urDb);
69 Asrt.asrtEquals("赵六",Realname());
70 ssion.clo();
71 }
72 @Test
73public void update() throws ParException {
74 SqlSession ssion = factory.openSession();
75 Urs dbUr = ssion.lectOne("com.dao.UrsMapper.findById",6);
76 Asrt.asrtNotNull(dbUr);
77 dbUr.tNickname("zhaoliu");
78// 2020-03-03 14:13:23 => 2019-10-09 10:11:42 : 2种
79/*Calendar cl = Instance(); // 当前时间
80 cl.t(Calendar.YEAR,2019);
81 cl.t(Calendar.MONTH,9); // 0-11
82 cl.t(Calendar.DAY_OF_MONTH,9); // 1-31
83 cl.t(Calendar.HOUR_OF_DAY,10); // 0-23
84 cl.t(Calendar.MINUTE,11); // 1-60
85 cl.t(Calendar.SECOND,42); // 1-60
86 cl.t(Calendar.MILLISECOND,0); Date Time();*/
87 SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
88 Date date = df.par("2020-10-09 10:11:43"); //常⽤于判断从⽹络接受的时间
89 dbUr.tCreateTime(date);
90 ssion.update("com.dao.UrsMapper.update",dbUr);
91 it();
92 Urs ur = ssion.lectOne("com.dao.UrsMapper.findById",6);
93 Asrt.asrtNotNull(ur);
94 Asrt.asrtEquals("zhaoliu",ur.getNickname());
95 Asrt.asrtEquals(CreateTime());
96 }
97 @Test
98public void delete(){
99// hibernate,mybatis
100// 主从表/⽗⼦表的概念?主表-主键所在的表,从表-外键所在的表
101// 1、添加数据:先为主表添加数据,后为从表添加数据
102// 2、删除数据:先删除从表数据,然后删除主表数据
103// n_urs (主表) 的从表:n_news,n_replys,n_short_replys,n_access_logs
104// a主->b从->c从->d从,不创建外键(外键关系是存在的)
105 SqlSession ssion = factory.openSession();
106 ssion.delete("com.dao.AccessLogsMapper.deleteByUrsId",6);
107 ssion.delete("com.dao.ShortReplysMapper.deleteByUrsId",6);
108 ssion.delete("com.dao.ReplysMapper.deleteByUrsId",6);
109 ssion.delete("com.dao.NewsMapper.deleteByUrsId",6);
110 ssion.delete("com.dao.UrsMapper.delete",6);
111 it();
112 Urs ur = ssion.lectOne("com.dao.UrsMapper.findById",6);
113 Asrt.asrtNull(ur);
114 }
115 }
在执⾏删除操作时,记得删除外键⾥的记录,后删除主键内的记录。 // 主从表/⽗⼦表的概念?主表-主键所在的表,从表-外键所在的表
101 // 1、添加数据:先为主表添加数据,后为从表添加数据
102 // 2、删除数据:先删除从表数据,然后删除主表数据
103 // n_urs (主表) 的从表:n_news,n_replys,n_short_replys,n_access_logs
104 // a主->b从->c从->d从,不创建外键(外键关系是存在的)
6. 之后依次把实体类,实现Mapper,并在主配置⽂件中配置,Mapper。
7. 学会审视⾃⼰的代码,=》审查(语法错误,逻辑错误)、优化、重构。
8. 增加⽅法:@Before:是表⽰在每⼀个测试⽅法执⾏前,都会调⽤该⽅法。
9. 增加⽅法:@BeforeClass:是表⽰在多个单元测试⽅法中,⽆论有多少个测试⽅法,都只执⾏⼀次。