发表于: 2018-03-20 21:11:51

1 485


今日完成


·junit单元测试

·整合spring和mybatis(未完待续)




1.junit单元测试


1.1什么是junit单元测试

就是测试自己的代码是否能正确执行,并且运行的结果是否是自己的预期。单元是最小的元素,代码最零碎的元素都要测试到,也是类似于考试后的检查。比如你写了一个简单的运算方法,使用单元测试就能测试出它运算结果是不是正确的,是不是你想要的结果,从而可以拨乱改正,保证运行。

使用junit的好处:

通过写测试方法可以一目了然的看出是否出错。系统自动运行,可以单独测试某一个模块,找出具体原因,只需要看最后结果就能知道是否通畅,对方向有偏差的也能及时调整过来。


1.2.junit环境配置

·安装插件:File-->settings-->Plguins-->Browse repositories-->输入JUnit-->选择JUnit 安装,jar包也要在pom里配置好。

如果没有JUnitGenerator V2.0就直接搜索“JUnitGenerator”,然后找到安装点右边Install安装。

JUnitGenerator是自动生成测试代码,如果没有的话也可以自己写。


1.3.测试方法:

在需要测试的类里面空白处右键,选择goto——test,快捷键shift + ctrl + t

然后在弹出的选择框里面创建Test类


然后在下面选择要测试的方法,上面选择测试的父类,一定要选择,不然没办法执行测试

ok生成测试类

package pojo;

import junit.framework.TestCase;
import org.junit.Test;

import static org.junit.Assert.*;

public class UserTest extends TestCase {
@Test
   public void testGetId() throws Exception {
System.out.print("测试testGetId()\n");
   }

@Test
   public void testSetId() throws Exception {
System.out.print("测试testSetId()\n");
   }

@Test
   public void testGetCreate_at() throws Exception {

System.out.print("测试第三个\n");
   }

}

在里面写你要测试的方法,生成的测试方法记得要在前面+test首字母大写:

@Test
public void setId() throws Exception { System.out.print("测试testSetId()\n");}
@Test
public void testSetId() throws Exception { System.out.print("测试testSetId()\n");}

然后右键运行测试方法。

注意光标的位置,idea对这个有判断的,光标在什么地方,鼠标在什么地方右键,它会判断该地方可以用什么样的方法:

测试:




2.spring整合mybatis

网上看了很多,但大都不怎么统一,经常缺斤少两,今天也是看的比较茫然,先整理出具体思路,尝试整合:

·spring整合mybatis有好几种方法,不过都需要通过mybatis的spring-mybatis.jar包,然后配置数据源

·先使用mybatis.SqlSession的实现类mybatis.spring.SqlSessionTemplate

·整合的话之前写的Mapper指向的就不是之前User实体类了,而是根据具体的方法指向,然后由mybatis给出实例化查询

·根据整合的方式不同,需要配置的resource文件调用的方法也不相同。


目录:

 配置springxml文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
      xmlns:context="http://www.springframework.org/schema/context"
      xmlns:mvc="http://www.springframework.org/schema/mvc"
      xsi:schemaLocation="http://www.springframework.org/schema/beans
                       http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
                       http://www.springframework.org/schema/context
                       http://www.springframework.org/schema/context/spring-context-3.1.xsd
                       http://www.springframework.org/schema/mvc
                       http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">

   <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
       <property name="dataSource" ref="dataSource"/>
       <property name="mapperLocations" value="Mapper"/>
       <property name="typeAliasesPackage" value="com.java.dao"/>
       <!--指定实体类映射文件,可以指定同时指定某一包以及子包下面的所有配置文件,mapperLocationsconfigLocation 有一个即可,
       当需要为实体类指定别名时,可指定configLocation属性,再在mybatis总配置文件中采用mapper引入实体类映射文件 -->
       <property name="configLocation" value="classpath:mybatis-config.xml"/>
   </bean>

   <bean id="slqSession" class="org.mybatis.spring.SqlSessionTemplate ">
       <!--指向上面的bean-->
       <constructor-arg index="0" ref="sqlSessionFactory"/>
   </bean>
   <bean id="suserimpl" class="com.java.daoimpl.SuserImpl">
       <property name="sqlSessionTemlpate" ref="slqSession"/>
   </bean>
   <!--这里使用spring的驱动,不使用"com.mysql.jdbc.Driver,这是在下面用-->
   <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
       <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
       <property name="url" value="jdbc:mysql://localhost:3306/jnshu" />
       <property name="username" value="root" />
       <property name="password" value="root" />
   </bean>
</beans>

)先配置Mybatis的工厂bean,获取Mybatis的配置文件:

 <property name="dataSource" ref="dataSource"/> 配置数据源 ref指向最下面的bean(id=dataSource)

 <property name="configLocation" value="classpath:mybatis-config.xml"/>mybatis配置文件路径,配置这两数据源个必不可少。

 <property name="mapperLocations" value="Mapper"/>规定mapperLocations的classpath,我这里其实不配也可以通过,会在资源目录下自动扫描(mybatis里也配置了,看下面)

 <property name="typeAliasesPackage" value="com.java.dao"/>这个设置直接读取包,这样在mapper文件里可以直接写对应的类名字,不用写全部路径

<constructor-arg index="0" ref="sqlSessionFactory"/>使用构造函数注入 index是多个构造函数的情况下的顺序,从0开始。


mybytis配置文件(未动,相同的配置覆盖):

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
   <!--定义外部资源!这里定义的要在下面的数据源(dataSource type="POOLED")中使用到!位置为资源根目录resources,区分大小写!-->
   <properties resource="mysql.properties" />
   <typeAliases>
       <!--给名字不好用的com.java.pojo.User类定义个别名User,这样可以在任何地方用User调用,注意是任何地方!-->
       <!--一定要对应user Mapper里的resoultType,不然会报:java.lang.ClassNotFoundException: Cannot find class: User(找不到User类)-->
       <typeAlias alias="User" type="com.java.pojo.User"></typeAlias>

   </typeAliases>
   <environments default="development">
       <environment id="development">
           <transactionManager type="JDBC"/>
           <dataSource type="POOLED">
               <property name="driver" value="${jdbc.driver}"/>
               <property name="url" value="${jdbc.url}"/>
               <property name="username" value="${jdbc.username}"/>
               <property name="password" value="${jdbc.password}"/>
           </dataSource>
       </environment>
   </environments>

   <mappers>
       <mapper resource="Mapper/User.xml"/>
   </mappers>

</configuration>


mapper(user.xml):

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!--<mapper namespace="com.java.pojo.User">-->
<mapper namespace="com.java.dao.Suser">

   <!--<resultMap type="model.user" id="allUserList">-->
   <!--<result column="id" property="id"/>-->
   <!--<result column="create_at"  property="create_at"/>-->
   <!--<result column="updatae_at"  property="updatae_at"/>-->
   <!--<result column="name" property="name"/>-->
   <!--<result column="age" property="age"/>-->
   <!--<result column="six"  property="six"/>-->
   <!--<result column="pro" property="pro"/>-->
   <!--<result column="brother"  property="brother"/>-->
   <!--</resultMap>-->

   <select id="selectById" parameterType="int" resultType="User">
       SELECT * FROM jnshu_user WHERE id = #{id}
</select>
   <insert id="insertUser" parameterType="User" useGeneratedKeys="true" >
       INSERT INTO jnshu_user(create_at,updatae_at,name,age,six,pro,brother) values (#{create_at},#{updatae_at},#{name},#{age},#{six},#{pro},#{brother})
</insert>
   <update id="updateUser" parameterType="User" >
       Update jnshu_ser SET name=#{name},age=#{age},six=#{six},pro=#{pro},brother=#{brother} WHEN name=#{name} AND id=#{id}
</update>
   <delete id="delectUser" parameterType="int" >
       DELECT FROM jnshu_user WHERE id=#{id}
</delete>
   <!--<select id="findAllUSer" parameterType="model.user" resultMap="allUserList ">-->
       <!--SELECT * FROM jnshu_user-->
   <!--</select>-->

</mapper>

这里只用了selectById,下面写出来还未测试


Suser接口:

package com.java.dao;
import com.java.pojo.User;

import java.util.List;


public interface Suser {

public User selectById(User user);
   void updateUser(User user);
   void delectUSer(int id);
   void insert(User user);
   List<User> findAllUser();

}


SuserImpl接口实例:

修改selectById(参数) id改为user类,通过里面的属性传参。

package com.java.daoimpl;

import com.java.dao.Suser;
import com.java.pojo.User;
import org.apache.ibatis.session.SqlSession;
import org.mybatis.spring.SqlSessionTemplate;

import java.util.List;

public class SuserImpl implements Suser{

private SqlSessionTemplate sqlSessionTemlpate;

   public User selectById(User user) {

     return (User)sqlSessionTemlpate.selectOne("com.java.pojo.User.getUser",user);
   }

public void updateUser(User user) {

}
public void delectUSer(int id) {

}
public void insert(User user) {

}
public List<User> findAllUser() {
return null;
   }
public void setSqlSessionTemlpate(SqlSessionTemplate sqlSessionTemlpate) {
this.sqlSessionTemlpate = sqlSessionTemlpate;
   }
public SqlSessionTemplate getSqlSessionTemlpate() {
return sqlSessionTemlpate;
   }
}


测试类:

package mybatistest;

import com.java.dao.Suser;
import com.java.pojo.User;
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 java.io.IOException;
import java.io.Reader;

public class Test {

public static void main(String[] args)throws IOException{

Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
       SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
       SqlSession session = sqlSessionFactory.openSession();
//        User user = session.selectOne("selectById",1);
//        session.commit();
//        System.out.print(user.getName());

//      Suser.class获取SuserClass对象
//      classclassforName(String name)也可以获取,但是需要强制转换,因为使用的是字符串,而且必须获取ClassNotFoundException异常
//      也可以通过类里面的getClass()获取
       Suser su = session.getMapper(Suser.class);
       User u = new User();
       u.setId(1);
       User user = su.selectById(u);
       System.out.print("查出的名字为:" + user.getName() + ",年龄:" + user.getAge() + ";");
       session.close();

   }

}


用junit测试了下(尝试测试,不知道对不对):

package mybatistest;
import junit.framework.TestCase;
public class TestTest extends TestCase

public void testMain() throws Exception 


System.out.print("查出");

   }

}


然后运行了测试类,改了下输出方便查看,竟然一次就运行通过了。日志输出先不管…


明天计划完成的事情:

1.再强化整合一下框架,还没写完。感觉看的又多又乱,分不清,一下也看不完,吸收不了。

2.注解的方法

3.hibernate,记得刚开始接触java的时候学的就是hibernate框架,struts没看,但是现在全都忘掉了。

问题与收获:

1.有时候感觉抓不到重点。而且学习方法要有效率,不能盲目寻找,要有目的的去查。不能心急焦虑,有错才有进步,基础扎实了后面才会走的顺;

2.会了junit的简单测试

·之前没有接触过这个概念,还有具体调试方法也不知道,所以被整了一天,还有很多地方没弄明白需要看。

·@注释 各种注释的意思 @Test如何测试的 是可以直接在代码Class里直接@、还是说需要创建出Test类在里面@Test等等。可莫名其妙的是自动生成的测试代码都是报红的:@Test,然后删除了又新建也不行,重复删除创建…又好了。

·@基于注解方式还没了解

3.Spring整合Mybatis的方法,只用了一种,基础还没理解透彻。但是明白了大致方向(主要是各种配置的映射关系,函数是写在实体类里还是别的地方,SQL映射文件,mapper文件在哪里调用等待)。





返回列表 返回列表
评论

    分享到