基于spring和mybatis项目的JUnit测试用例的实现

主要目的:实现JUnit的Crud
项目目前情况:spring+mybatis
想在前后端分离的情况下,
后端实现各个模块CRUD的junit
遇到的最大问题先是注入之后提示nullPointException
接着很快反应过来
是junit运行单个文件的时候并没有在启动容器,也就是说单独执行一个文件没有初始化spring,也就无法使用service了
那么如何才能初始化spring呢?这就是这次junit中遇到的最大的问题

@Autowired
public static ProjectService projectService;

package test;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import net.sf.json.JsonConfig;
import org.junit.BeforeClass;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import project.dao.ProjectDao;
import project.dao.ProjectService;
import project.domain.Project;

import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

//import org.springframework.beans.factory.annotation.Autowired;

/**
 * Created by san-pc on 2016/2/26.
 */
public class ProjectTestbeat1 {

   /* @Autowired
    public static ProjectDao projectDao;
*/
   @Autowired
   public static ProjectService projectService;
    @BeforeClass
    public static void init() {//junit之前init spring
        ApplicationContext   context = new ClassPathXmlApplicationContext("classpath*:conf/root.xml");//这里路径之前没有配对于是一直出错
        projectService = (ProjectService)context.getBean("projectService");
    }
    @Test
    public  void addProject() throws Exception {
        Project project = new Project();
        project.setProjectName("七天通知贷");
        project.setProjectCode("20151601032046");
        project.setProjectType("通知贷");
        project.setInterestDate(7);
        project.setInterestRatio(0.0009);
        project.setCompanyId(1);
        project.setCompanyName("旺金控股公司");
        project.setLinkmanId(Long.valueOf(16292 + ""));
        project.setLinkmanName("胡二");
        project.setCreateId(16309);
        project.setCreaterName("罗星星");
        project.setBudgetIncome(12000);
        project.setBudgetExpenses(1000);
        project.setRealExpenses(2000);
        project.setCreateDate(new Date());//创建日期
        project.setEditDate(new Date());//最后修改时间
        project.setPstartDate(new Date());//竞标日期
        project.setPfullDate(new Date());//满标日期
        project.setPvalueDate(new Date());//起息日期
        project.setPendDate(new Date());//回款日期
        project.setPrealendDate(new Date());//实际回款日期
        project.setRemark("测试数据");
        project.setStateCode("0");
        projectService.insertProject(project);
        projectService.updateProject(project);

    }

    public static void main(String[] args){
        try {
         //   addProject();
        } catch (Exception e) {
            System.out.println("---------------------添加错误--------------------");
            e.printStackTrace();
        }
    }
    public Map<String, String> SELECT1(Map<String, String> b) {
        return b;
    }

    // @Test
    public static Map<String, Project> JSON2Map() {
        System.out.println("shuchu");
        Map<String, Project> map = new HashMap<String, Project>();
        return map;
    }
}

上面代码中的
ApplicationContext context = new ClassPathXmlApplicationContext(“classpath*:conf/root.xml”);//
大家一定觉得好奇了,因为我们的配置文件肯定不止一个,如何把spirng和spring-mvc以及其他xml引入呢?
这个时候就需要写一个类似web.xml的文件包含所有需要的配置文件了
即:root.xml
这里写图片描述

接着spring的初始化就算完成了
接着是测试mapping的crud
首先是测试insert


第一部分是基本配置
<mapper namespace="project.dao.ProjectDao">


    <!--表名 -->
    <sql id="table_name">project</sql>

    <sql id="table_roles">staff_roles</sql>

    <sql id="select_fields">
               project_name,project_code, project_type, interest_date,interest_ratio,company_id,
                company_name,linkman_id,linkman_name,create_id,creater_name,budget_income,
                budget_expenses,real_expenses,create_date,edit_date,
               pstart_date, pfull_date,pvalue_date,pend_date,prealend_date,remark,state_code
    </sql>
    <resultMap id="entityMap" type="project.domain.Project">
        <result column="project_name" property="projectName"  />
        <result column="project_code" property="projectCode" />
        <result column="project_type" property="projectType" />
        <result column="interest_date" property="interestDate" />
        <result column="interest_ratio" property="interestRatio" />
        <result column="company_id" property="companyId" />
        <result column="company_name" property="companyName"  />
        <result column="linkman_id" property="linkmanId" />
        <result column="linkman_name" property="linkmanName" />
        <result column="create_id" property="createId" />
        <result column="creater_name" property="createrName" />
        <result column="budget_income" property="budgetIncome" />
        <result column="budget_expenses" property="budgetExpenses" />
        <result column="real_expenses" property="realExpenses" />
        <result column="create_date" property="createDate"  />
        <result column="edit_date" property="editDate" />
        <result column="pstart_date" property="updatedAt" />
        <result column="pfull_date" property="operatorId" />
        <result column="pvalue_date" property="pvalueDate" />
        <result column="pend_date" property="pendDate"  />
        <result column="prealend_date" property="prealendDate" />
        <result column="remark" property="remark" />
        <result column="state_code" property="stateCode" />
    </resultMap>

第二部分是CRUD模块的实现
    <!--新增-->
    <!--keyProperty:指主键属性名,也是返回的数据
    useGeneratedKeys:表示设置是否使用JDBC的getGenereatedKeys方法获取主键并赋值到keyProperty设置的领域模型属性中->
    <insert id="insertProject" parameterType="project.domain.Project" keyColumn="project_id" useGeneratedKeys="true" keyProperty="project_id">
        INSERT INTO
        <include refid="table_name"></include>
        (
        <include refid="select_fields" />
        )
        VALUES
        (
        #{projectName},#{projectCode},#{projectType},#{interestDate},#{interestRatio},#{companyId},
        #{companyName},#{linkmanId},#{linkmanName},#{createId},#{createrName},#{budgetIncome},
        #{budgetExpenses},#{realExpenses},#{createDate},#{editDate},
        #{pstartDate},#{pfullDate},#{pvalueDate}, #{pendDate}, #{prealendDate},#{remark},
        #{stateCode}
        )
    </insert>

最后测试结果(如下)新增成功,但是部分字段未保存成功,数据丢失问题,有空继续补全

这里写图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
1.junit 常用注解 @Before 初始化方法,每次测试方法调用前都执行一次。 @After 释放资源:每次测试方法调用后都执行一次 @Test 测试方法:在这里可以测试期望异常和超时时间 @ignore 忽略的测试方法 @BeforeClass 针对所有测试,只执行一次,且必须为static void @AfterClass 针对所有测试,只执行一次,且必须为static void @RunWith 指定测试类使用的某个运行器参数SpringJUnit4ClassRunner.class @Parameters 指定参数类的参数数据集合 @Rule 允许灵活添加或重新定义测试类中的每个测试方法的行为 @FixMethodOrder 指定测试方法的执行顺序 @ContextConfiguration 参数locations="classpath:spring-mybatis.xml" 指向src下的该文件 执行顺序: @BeforeClass---@Before---@Test---@After---@Before ---@Test---@After---@AfterClass junit与main方法相比的优势:代码量少、结构清晰、灵活性更好 main:一个类中只能有一个main方0法 层次结构方面不够清晰 运行具体某一个方法时,要将其他的方法注释掉 2.mybatis的基本配置 1.dao层接口 2.mapper.xml:编辑需要执行的sql语句 (1)mapper标签的namespace属性:指定该xml对应的dao层接口的路径 3.spring-mybatis.xml:spring集成mybatils的配置文件 (1)配置sqlSessionFactory指定要操作的数据库,以及mapper.xml的所在目录 (2)配置指定的dao层接口的目录 3.mybatis的注意事项 1.xml中的sql不得有分号 2.sql语句操作的表明和列名 3.xml中的小于号:$lt;大于号¥> 4.取变量时,如果dao层接口使用的是@param("别名")注解,则根据别名取值 5.mapper.xml中$和#取值的区别 4.mybatis的xml中如何设置返回值 resultType返回的数据类型 5.$和#区别 1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #{user_id},如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id". 2. $将传入的数据直接显示生成在sql中。如:order by ${user_id}, 如果传入 的值是id,则解析成的sql为order by id. 3. #方式能够很大程度防止sql注入。 4. $方式无法防止Sql注入。 5. $方式一般用于传入数据库对象,例如传入表名. 6. 一般能用#的就别用$ MyBatis排序时使用order by 动态参数时需要注意,用$而不是#

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值