`
zhangfeilo
  • 浏览: 401412 次
  • 性别: Icon_minigender_1
  • 来自: 昆明
社区版块
存档分类
最新评论

spring 3 和mybatis 3集成,并用junit4进行测试

阅读更多

最近一个项目使用的是struts2+Spring3+mybatis3的技术框架,由于开发人员都不熟悉如何进行单元测试,今天有空,简单研究了一下如何用junit4来测试基于这个框架的代码。由于struts的action只是负责前台的请求转发,而所有的业务都是在service层处理,因此一般情况下只需对service进行单元测试,而不需要对action进行单元测试。下面介绍一个简单的例子:

开发环境:

SystemWindows xp
IDEeclipse Java EE 3.6
DatabaseMySQL

开发依赖库:

JavaEE5Spring 3.0.5Mybatis 3.0.4myBatis-spring-1.0junit4.8.1

一、准备工作:

1、下载jar
Spring3 jar下载:

http://ebr.springsource.com/repository/app/library/version/detail?name=org.springframework.spring&version=3.0.5.RELEASE

MyBatis3 jar 下载:
http://www.mybatis.org/java.html
junit 4 jar下载:
http://www.junit.org/

 

2、 添加的jar包如下:


3、创建mysql的数据库表,步骤如下:

1、进入mysql的安装路径,假设在:C:\Program Files\MySQL\MySQL Server 5.1\bin;
2、输入命令:mysql -uroot -p,enter,输入密码:admin;
3、mysql>use test;
5、mysql>grant all privileges on test.* to test@'localhost'identified by 'test';
6、mysql>flush privileges;

4、mysql>
  create table account_bak(account_id int not null auto_increment,
                     username varchar(20),
                     password varchar(20),
                     create_time datetime,
                     primary key(account_id));

二、spring 和mybatis整合
1、在eclipse中创建一个java project,目录结构如下:


这是一个标准的maven工程的目录结构,下面逐一介绍上图涉及到的文件。
2、创建mybatis的配置文件mybatis.xml

<?xmlversion="1.0"encoding="UTF-8"?>

<!DOCTYPEconfigurationPUBLIC"-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>

    

</configuration>

上面的配置文件中,可以加入一些公共、常用的MyBatis方面的全局配置。handlerobjectFactoryplugin、以及mappers的映射路径(由于在spring配置文件spring.xml中的SqlSessionFactoryBean有配置mapperlocation,这里就不需要配置)等。这个文件名称和下面的spring.xml中的configLocation中的值对应,不是随便写的。
3、创建spring的配置文件spring.xml

<?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:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"
 xsi:schemaLocation="
   http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
   http://www.springframework.org/schema/context
   http://www.springframework.org/schema/context/spring-context-2.5.xsd
   http://www.springframework.org/schema/jee
   http://www.springframework.org/schema/jee/spring-jee-2.5.xsd
   http://www.springframework.org/schema/tx
   http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

 <bean
  class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" />
 
 <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/test?useUnicode=true&amp;characterEncoding=UTF-8" />
  <property name="username" value="test" />
  <property name="password" value="test" />
 </bean>
 
 <!-- 配置事务管理器,注意这里的dataSource和SqlSessionFactoryBean的dataSource要一致,不然事务就没有作用了 -->
 <bean id="transactionManager"
  class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource" ref="dataSource" />
 </bean>

 <tx:annotation-driven transaction-manager="transactionManager" />
 <!-- myBatis文件 -->

 <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  <property name="configLocation" value="classpath:mybatis.xml" />
  <property name="mapperLocations"
   value="classpath*:com/glen/model/*.xml" />
  <property name="dataSource" ref="dataSource" />
 </bean>
 
 <bean id="accountDao" class="com.glen.dao.AccountDao">
  <property name="sessionFactory" ref="sqlSessionFactory"/>
 </bean>
 
 <bean id="accountService" class="com.glen.service.AccountService">
  <property name="accountDao" ref="accountDao"/>
 </bean>
 
 <context:annotation-config />
 <context:component-scan base-package="com.glen" />

</beans>

4、JavaBeanModelEntity)相关类、及mybatis 的mapper对象

javabean:

package com.glen.model;

import java.io.Serializable;
import java.util.Date;

public class Account implements Serializable {

 private static final long serialVersionUID = -7970848646314840509L;
 
 private Integer accountId;
 private String username;
 private String password;
 private Date createTime;

 public Account() {
  super();
 }
//下面是getter、setters

 

account-resultMap.xml

 

<?xmlversion="1.0"encoding="UTF-8"?>

<!DOCTYPEmapperPUBLIC"-//mybatis.org//DTD Mapper 3.0//EN" 

    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mappernamespace="accountMap">

    <resultMaptype="com.hoo.entity.Account"id="accountResultMap">

       <idproperty="accountId"column="account_id"/>

       <resultproperty="username"column="username"/>

       <resultproperty="password"column="password"/>

       <resultproperty="createTime"column="create_time"/>

    </resultMap>

</mapper>

 

account-mapper.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="account">

 
 <select id="getList" parameterType="com.glen.model.Account" resultType="list" resultMap="accountResultMap">
   select * from account where username like '%' #{username} '%'
 </select>
 
 <select id="getAllAccount" resultType="list" resultMap="accountResultMap">
   select * from account
 </select>
  
 
 <!-- accountResultMap是account-resultmap.xml中定义的resultmap -->
 <select id="get" parameterType="com.glen.model.Account" resultType="com.glen.model.Account" resultMap="accountResultMap">
  <![CDATA[
   select * from account where account_id = #{accountId}
        ]]>
 </select>
 
 
 <!-- 自动生成id策略 -->
 <insert id="add" useGeneratedKeys="true" keyProperty="accountId" parameterType="com.glen.model.Account">
  insert into account(account_id, username, password)
  values(#{accountId,jdbcType=BIGINT}, #{username}, #{password})
<!--将最后插入的逐渐返回到java对象-->
  <selectKey resultType="int" keyProperty="accountId">
   SELECT LAST_INSERT_ID()
  </selectKey>
  
 </insert>
  
 <update id="edit" parameterType="com.glen.model.Account">
  update account set
  username = #{username},
  password = #{password}
  where account_id = #{accountId}
 </update>
 
 <delete id="remove" parameterType="com.glen.model.Account">
  delete from account where account_id = #{accountId}
 </delete>
  
</mapper> 


5、创建dao:

 

package com.glen.dao;

import javax.annotation.Resource;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.stereotype.Repository;

import com.glen.model.Account;


public class AccountDao {

 private SqlSessionFactory sessionFactory;

 public AccountDao() {

 }

 public SqlSessionFactory getSessionFactory() {
  return sessionFactory;
 }

 public void setSessionFactory(SqlSessionFactory sessionFactory) {
  this.sessionFactory = sessionFactory;
 }

 public void insert(Account account) {

  SqlSession session = sessionFactory.openSession();
  session.insert("account.add", account);
 }
 
 public Account getAccountById(Account account) {
  
  SqlSession session = sessionFactory.openSession();
  Account accountFromDb = (Account)session.selectOne("account.get", account);
  return accountFromDb;
 }
}

 

6、创建service:

 

package com.glen.service;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;

import com.glen.dao.AccountDao;
import com.glen.model.Account;


public class AccountService {
 
 private AccountDao accountDao;
 
 /**
  * 新增一个帐户。
  * @param account
  */
 public void insertAccount(Account account) {
  
  accountDao.insert(account);
 }

 /**
  * 根据帐户ID查找帐户信息
  * @param account
  * @return
  */
 public Account getAccountById(Account account) {
  
  return accountDao.getAccountById(account);
 }
 
 public AccountDao getAccountDao() {
  return accountDao;
 }

 public void setAccountDao(AccountDao accountDao) {
  this.accountDao = accountDao;
 }
}

 


Ok,至此spring 和mybatis就整合好了。

三、用junit进行单元测试
在src/test/java目录下,创建一个测试类:TestAccountService:

 

package com.glen.service;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;

import org.apache.log4j.Logger;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

import com.glen.model.Account;


public class TestAccountService {
 
 Logger logger = Logger.getLogger("TestAccountService");
 
 AccountService service = null;

 @Before
 public void init() {
  
  ApplicationContext aCtx = new FileSystemXmlApplicationContext(
    "classpath:spring.xml");
  AccountService service = (AccountService) aCtx
    .getBean("accountService");
  assertNotNull(service);
  this.service = service;

 }
 
 @Test
 public void testInsertAccount() {

  // 创建一个帐户
  Account account = new Account();
  // account.setAccountId(1);
  account.setUsername("selina");
  account.setPassword("123456");
  
  //将创建的帐户插入到数据库中
  service.insertAccount(account);
  logger.debug("account id: " + account.getAccountId());
  
  //从数据库获取刚才插入的帐户
  Account accountFromDb = service.getAccountById(account);
  assertNotNull(accountFromDb);
  assertEquals(account.getAccountId(), accountFromDb.getAccountId());
 }

}


测试通过,显示如下界面:


四、使用spring的标记来注入对象
如上所述,我们在spring的配置文件spring.xml中,定义了两个业务模块相关的bean,accountDao和accountService,但是在实际项目中,这样的dao和service会非常多,如果每个都要这样定义,会造成配置文件的体积过大,可阅读性和可维护性都会变差。

那么如何对spring.xml进行瘦身呢?有两种方案,第一种方案是分模块开发,对于模块内部的bean,写在对应模块内部的spring配置文件中,如:spring-account.xml;第二种方案,就是使用spring的标记。下面我想说说的就是,用spring的标记:@Service @Repository @Resource来实现对象的注入。在上面这个例子基础上,做以下步骤的修改:

1、注释掉spring.xml中的两个bean:accountDao和accountService的定义

  <!--  
 <bean id="accountDao" class="com.glen.dao.AccountDao">
  <property name="sessionFactory" ref="sqlSessionFactory"/>
 </bean>
 
 <bean id="accountService" class="com.glen.service.AccountService">
  <property name="accountDao" ref="accountDao"/>
 </bean>
 -->


2、在AccountDao类中添加两个标记:@Repository和 @Resource,

 

@Repository
public class AccountDao {

 @Resource
 private SqlSessionFactory sessionFactory; 

这里添加@Repository标记,相当于在spring.xml中定义了一个bean,bean的id为这个类对象名称的第一个字母改成小写后的字符串,即:accountDao。添加 @Resource标记,相当于在accountDao这个bean中,引用了一个“sqlSessionFactory”。

3、在AccountService类中添加两个标记:@Service 和 @Resource:

@Service
public class AccountService {
 
 @Resource
 private AccountDao accountDao;


4、运行TestAccountService,同样测试通过。

分享到:
评论

相关推荐

    Spring框架是在2003年兴起的一门轻量级的JAVAEE框架技术 Spring框架学习资料第五天

    本篇将主要探讨Spring框架的几个核心知识点,包括事务传播属性、注解式事务管理、注解式开发、SSM(Spring+SpringMVC+MyBatis)集成开发流程以及Spring与JUnit测试的整合。 **一、事务传播属性失效问题及解决** ...

    spring mvc简单测试的可运行的源代码

    在这个"spring mvc简单测试的可运行的源代码"中,我们可以学习到如何配置和运行一个基础的Spring MVC应用。 1. **环境准备**:首先,你需要安装Java JDK和Apache Maven或Gradle,它们是构建和管理Java项目的工具。...

    Java自助借书系统源码.zip

    10. **单元测试和集成测试**:为了确保代码质量,开发者通常会编写JUnit测试用例进行单元测试,使用Mockito模拟外部依赖。集成测试则通过如Spring Boot的TestRestTemplate或JUnit + Spring Test进行,确保各组件协同...

    IT后端Java工程师的学习路线图

    3. **Jenkins**:掌握Jenkins持续集成工具,实现自动化构建和测试。 ### 七、其他技能 1. **单元测试与Mocking**:使用JUnit、Mockito进行单元测试,确保代码质量。 2. **性能监控**:了解JProfiler、VisualVM等...

    MyBatis-CMEU-Maven:该仓库为MyBatis-CMEU的maven版本,主要方便大家自己做修改

    7. **测试代码**:项目可能包含JUnit测试用例,帮助开发者验证代码的正确性。 由于MyBatis-CMEU-Maven 已经不再维护,并且建议使用Spring-generator替代,这可能意味着Spring-generator提供了更多功能或者更好的...

    SpringBoot入门项目

    1. **单元测试**:SpringBoot支持JUnit和Mockito进行单元测试,`@SpringBootTest`注解可以帮助创建Spring应用上下文。 2. **集成测试**:使用`@WebMvcTest`或`@DataJpaTest`进行特定层的测试。 ### 七、SpringBoot...

    SpringBoot2.2.6 整合Jwt实现前后端分离

    - 使用JUnit进行单元测试,确保功能正常。 - 打包成jar或war,部署到服务器,如Tomcat。 通过以上步骤,我们可以构建一个基于SpringBoot 2.2.6、MyBatis 3.5.4和JWT的前后端分离应用。这不仅可以实现安全的身份...

    java项目源码第28期前台+后台管理结合的新闻发布系统.zip

    15. **单元测试和集成测试**:可能使用JUnit和Mockito等工具进行代码测试,确保功能的正确性。 通过学习和实践这个项目,开发者能够掌握Java Web开发的全貌,包括前后端交互、数据库操作、权限控制等多个方面,对...

    beerstock-api:Java Spring Boot的Projeto desenvolvido para estudo de testes单元

    JUnit支持断言、参数化测试和测试套件等功能。同时,Mockito可能被用来创建和配置模拟对象,以隔离测试目标代码,避免外部依赖对测试结果的影响。 **5. API设计与RESTful原则** API(应用程序编程接口)是啤酒库存...

    项目整合商1

    8. **测试框架**:JUnit、Mockito等工具用于单元测试,而Selenium、Appium等则支持功能测试和UI自动化测试,确保整合后的系统稳定可靠。 9. **安全集成**:OAuth2、JWT(JSON Web Tokens)等协议用于实现身份验证和...

    Login_application1

    9. **测试**:确保登录功能的正确性通常需要单元测试和集成测试。JUnit是Java常用的单元测试框架,而Mockito可以帮助模拟依赖关系。 10. **版本控制**:由于文件名中包含“master”,可能意味着项目使用了Git进行...

    214

    13. **单元测试和持续集成**:JUnit是Java的单元测试框架,而Maven和Gradle是常见的构建工具,Jenkins等工具则用于持续集成和自动化部署。 14. **Java编程规范**:遵循一定的编码规范如命名规则、注释标准等,可以...

Global site tag (gtag.js) - Google Analytics