`

Spring回顾之五 —— 测试,JUnit与SpringTest的完美结合

阅读更多
    没有测试的程序,是不完整的,每一个从事写程序的人员,都应该坚持做单元测试,通过单元测试可以验证程序基本功能的有效性,从而保证整个系统的质量,功在一时,利在千秋。这里我们将尝试使用Junit和SpringTest,在之前的系统里添加测试功能。

第一步:JUnit与SpringTest的引入
    JUnit故名知意,是一个专门为Java语言提供单元测试的框架。平时的开发过程中,单元测试会频繁的用到,所以在JUnit之上,Spring又做了进一步的封装,这个集成的测试模块也就是SpringTest。
    SpringTest的使用可以避免频繁、重复的容器加载,这个使用起来会有很好的体验。它还可以不用像JUnit那样通过getBean()方法去容器里获取目标元素,直接就像在实际开发中一样,做好配置,写好标签就可以得到想要的结果。SpringTest还做了对数据库操作的回滚处理,这个在日常测试使用中相当实用,可以避免去数据库做频繁修改以确保环境正常。等等诸多,SpringTest能在强大的JUnit之上让我们更加方便的进行单元测试,来先看看他们所需的依赖包,打开pom文件,在dependencies里添加以下代码

		<!-- ============== test begin ============== -->
		<dependency><!-- JUnit单元测试框架 -->
		    <groupId>junit</groupId>
		    <artifactId>junit</artifactId>
		    <version>4.12</version>
		    <scope>test</scope>
		</dependency>
		<dependency><!-- spring对测试框架的简单封装功能 -->
		    <groupId>org.springframework</groupId>
		    <artifactId>spring-test</artifactId>
		    <version>${spring.version}</version>
		    <scope>test</scope>
		</dependency>
		<!-- ============== test end ============== -->

    就酱,更新系统,依赖的相应jar包会添加到系统,接下来我们写程序运行运行来看看效果。

第二步:JUnit测试验证
    我们先来看看单独使用JUnit进行测试的样子,在src/test/java下,建立准备编写测试类的包,然后创建名为JunitTestUser的测试类,代码如下
package test.demo;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import test.demo.dao.UserDAO;
import test.demo.data.User;

public class JunitTestUser {
	private static final Logger logger = LoggerFactory.getLogger(JunitTestUser.class);
	private UserDAO userDao;
	
	@Before
	public void init() {
		ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("classpath*:applicationContext.xml");
		SqlSessionFactory sqlSessionFactory = (SqlSessionFactory) classPathXmlApplicationContext.getBean("sqlSessionFactory");
		SqlSession sqlSession = sqlSessionFactory.openSession();
		userDao = sqlSession.getMapper(UserDAO.class);
		classPathXmlApplicationContext.close();
	}
	@Test
	public void testGetUserById() {
		Integer userId = 1;
		User user = userDao.getUserById(userId);
		logger.info("用户的名字是 : " + user.getName());
	}
}

    这里边顺便提一下,这里使用的ClassPathXmlApplicationContext是spring读取xml比较常用的类,也可以直接用ApplicationContext,但共同的作用都是从spring的容器中获取所需的bean,我们这里获取了配置文件中的sqlSessionFactory,然后从这个连接池冲拿到数据库会话(SqlSession),继而我们可以得到所需的dao,通过这个dao我们可以进行对数据库的操作。
    这里回顾下我们的applicationContext.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:context="http://www.springframework.org/schema/context"
    xmlns:p="http://www.springframework.org/schema/p" 
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd 
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd 
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd ">

    <!-- 加载配置文件 -->
    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location" value="classpath:jdbc.properties" />
    </bean>
    <!-- ========================= ORM BEGIN  ========================= -->
    <!-- 数据源配置 -->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="${jdbc.driver}" />
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
        <!-- 初始化连接大小 -->
        <property name="initialSize" value="${jdbc.initialSize}"></property>
        <!-- 连接池最大数量 -->
        <property name="maxActive" value="${jdbc.maxActive}"></property>
        <!-- 连接池最大空闲 -->
        <property name="maxIdle" value="${jdbc.maxIdle}"></property>
        <!-- 连接池最小空闲 -->
        <property name="minIdle" value="${jdbc.minIdle}"></property>
        <!-- 获取连接最大等待时间 -->
        <property name="maxWait" value="${jdbc.maxWait}"></property>
    </bean> 
    <!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件,mapperLocations的设置将会自动扫描MyBatis的xml文件-->  
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">  
        <property name="dataSource" ref="dataSource"/>
        <property name="mapperLocations" value="classpath*:test/demo/mapper/*Mapper.xml"/>  
    </bean>
    <!-- DAO接口所在包名,Spring会自动寻找其路径下的接口 -->  
    <bean id="demoDaoFactory" class="org.mybatis.spring.mapper.MapperScannerConfigurer">  
        <property name="basePackage" value="test.demo.dao" />  
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>  
    </bean>
    <!-- 数据事务管理 ( Spring允许允许 MyBatis参与到事务管理中,所以MyBatis没有特定的事务管理器,直接利用了Spring中的 DataSourceTransactionManager) -->  
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
        <property name="dataSource" ref="dataSource"/>
    </bean> 
    <!-- ========================= ORM END  ========================= -->
</beans> 

    OK,测试部分的代码写完之后,我们直接右键,Run As ,选中Junit Test
   

    然后可以看到Eclipse的Junit栏运行之后会显示出一下的绿色条带
   

    OK,这是成功的运行了代码,测试没问题,然后我们去Console栏,打印的日志里我们可以看到如下代码
16:46:14,725  INFO DruidDataSource:785 - {dataSource-1} inited
16:46:14,900  INFO JunitTestUser:30 - 用户的名字是 : tom

    嗯,名字tom已经被打印,好,我们已经完成用JUnit做的单元测试,下边来看看加入SpringTest是什么效果。

第三步:JUnit与SpringTest共同的尝试
    紧接着我们创建一个名为SpringTestUser的测试类,代码如下
package test.demo;

import javax.annotation.Resource;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import test.demo.dao.UserDAO;
import test.demo.data.User;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath*:applicationContext.xml"})
public class SpringTestUser {
	private static final Logger logger = LoggerFactory.getLogger(SpringTestUser.class);
	
	@Resource
	private UserDAO userDao;
	
	@Test
	public void testGetUserById() {
		Integer userId = 1;
		User user = userDao.getUserById(userId);
		logger.info("用户的名字是 : " + user.getName());
	}
}

    注意标签@RunWith(SpringJUnit4ClassRunner.class)说的是我们这段代码其实用的还是JUnit进行测试的。@ContextConfiguration({"classpath*:applicationContext.xml"})以标签的形式完成对配置文件的加载,接下来看代码,简直是爽爆了,简洁明了的逻辑,只要配置文件里做好了注入的配置,这里直接通过标签获取即可,OK,我们来运行下:右键,Run As ,选中Junit Test...Junit栏运行显示已经测试成功
   

    我们去Console栏的日志里可以看到如下代码
16:55:57,241  INFO DruidDataSource:785 - {dataSource-1} inited
16:55:57,457  INFO SpringTestUser:26 - 用户的名字是 : tom
16:55:57,459  INFO GenericApplicationContext:987 - Closing org.springframework.context.support.GenericApplicationContext@4667ae56: startup date [Wed Mar 22 16:55:56 CST 2017]; root of context hierarchy
16:55:57,462  INFO DruidDataSource:1514 - {dataSource-1} closed

    OK,测试已完成!

第四步:小结
    这里不想用太多华丽的词藻来吹嘘使用SpringTest带来的便利,仅仅对比代码的就可以看出,使用SpringTest的优势。实际使用过程中SpringTest集成的对事物的处理啊,对测试数据的回滚啊,仅通过一个标签就可以实现,那可是提供了实实在在的方便,感兴趣的可以试下。




  • 大小: 27.6 KB
  • 大小: 16.4 KB
  • 大小: 15.9 KB
1
0
分享到:
评论

相关推荐

    单元测试之道Java版——使用Junit

    Junit提供了一套注解(如@Test、@Before、@After等)来标记测试方法,以及断言库来判断测试结果是否符合预期。例如,我们可以使用assertEquals()来比较预期结果与实际结果。 使用Junit进行单元测试的基本步骤如下:...

    spring-Test,Junit4 jar,和测试代码

    接下来,我们将深入探讨Spring Test与JUnit4的结合使用以及如何通过它们进行测试代码的编写。 首先,Spring Test模块提供了一组测试注解,如`@ContextConfiguration`、`@RunWith(SpringRunner.class)`等,这些注解...

    SSM中进行单元测试Junit4+spring-test所需jar包

    在SSM环境中,使用Junit4和spring-test库进行单元测试是标准做法。下面将详细解释如何使用这两个库以及所需的jar包。 Junit4是Java领域广泛使用的单元测试框架,它提供了一套丰富的注解,使得编写测试用例变得更加...

    利用JUnit和Spring-test对SpringJDBC组件DAO层测试

    总之,通过JUnit和Spring-test的结合使用,我们可以对SpringJDBC组件的DAO层进行全面、严谨的测试,确保其功能的正确性和稳定性。同时,合理配置Druid数据源,有助于优化测试性能。测试不仅是为了找出问题,更是为了...

    spring整合单元测试Junit开发包

    9. **AssertJ和Hamcrest**: Spring Test通常与这些强大的断言库结合使用,提供更清晰、表达力更强的断言,帮助编写更具可读性的测试代码。 10. **Mock Beans**: 可以使用`@MockBean`和`@SpyBean`注解在测试上下文中...

    spring MVC junit 单元测试(controller)

    1. **配置测试环境**:引入Spring Test和JUnit相关的依赖,创建一个继承自`AbstractJUnit4SpringContextTests`或`SpringRunner`的测试类。在测试类上使用`@RunWith(SpringRunner.class)`注解启用Spring测试支持,并...

    spring-text-3.2.8和junit4.10

    Spring Test与JUnit的结合,为Spring应用的测试提供了强大的组合。通过使用`@RunWith(SpringJUnit4ClassRunner.class)`,我们可以将Spring的IoC容器引入到JUnit测试中,使得Spring的组件可以直接在测试环境中被管理...

    单元测试之道Java版使用JUnit

    单元测试是软件开发过程中的重要环节,它旨在验证代码的各个独立模块是否按照预期...通过阅读《单元测试之道Java版使用JUnit》这本书,你可以深入了解如何有效地使用JUnit进行单元测试,以及如何构建强大的测试框架。

    struts-junit spring-mock spring-test junit的javadoc.jar文档

    struts-junit spring-mock spring-test junit等的javadoc.jar格式的API文档,直接导入Eclipse/MyEclipse/Netbeans等IDE即可实现快速API查询。 包含以下文件: File name -------------------------------------- ...

    spring4+JUnit简单测试

    Spring4与JUnit的结合使得我们可以创建集成测试,验证整个Spring应用的组件之间是如何协作的。通过`@Autowired`注解,我们可以注入需要测试的服务或者bean,然后在测试方法中调用它们。例如: ```java @RunWith...

    单元测试之道Java版-使用JUnit

    《单元测试之道Java版-使用JUnit》是一本深入讲解如何在Java开发中运用JUnit进行单元测试的专业指南。单元测试是软件开发过程中的重要环节,它能够确保代码的正确性、可维护性和稳定性。JUnit作为Java领域最流行的...

    通过spring管理的web工程的junit单元测试方法四

    在Spring框架中,进行Web工程的JUnit单元测试是软件开发中的关键步骤,它能确保代码的质量和可维护性。本文将深入探讨如何利用Spring管理的Web工程进行单元测试,以及如何借助工具提升测试效率。 首先,理解“通过...

    Eclipse安装插件——junit

    总的来说,Eclipse和Junit的结合使用极大地提高了Java开发人员的测试效率和代码质量。通过熟练掌握这两者的使用,开发者可以编写出更可靠、更易于维护的代码。同时,理解并熟悉如何安装和配置Eclipse插件,也是提高...

    基于Spring的JUnit单元测试

    在Java开发领域,Spring框架是应用最广泛的IoC(Inversion of Control)和AOP(Aspect Oriented Programming)框架之一,而JUnit则是Java语言中进行单元测试的标准库。本篇文章将详细探讨如何在Spring环境中利用...

    spring-framework-2.5.6 (含junit-4.4.jar、spring-test.jar)

    总的来说,Spring Framework 2.5.6与JUnit 4.4以及Spring Test的结合,为Java开发者提供了一个强大的测试平台。通过这个平台,开发者不仅可以快速构建高质量的Spring应用,还能确保其在不同环境下的稳定性和可靠性。...

    spring-dm junit

    在这些类中,你可以使用`@RunWith(SpringJUnit4ClassRunner.class)`注解来表明测试需要Spring Test的支持。 3. **定义测试上下文**:使用`@ContextConfiguration`注解来指定包含被测试组件的Spring配置文件。这样,...

    《单元测试之道Java版:使用JUnit》PDF 下载

    《单元测试之道Java版:使用JUnit》PDF 下载

    spring2 junit3

    结合这些文件,我们可以推断,这篇博文可能详细讲解了如何在Spring 2.x中设置JUnit3测试环境,包括编写测试类、配置Spring上下文以支持测试、使用依赖注入来模拟协作对象,以及如何通过Maven或Eclipse进行构建和执行...

Global site tag (gtag.js) - Google Analytics