Spring Test 整合 JUnit 4 使用总结

摘要:
转移自:https://blog.csdn.net/hgffhh/article/details/83712924在过去的两天里,我做了Web开发,发现在春季的对象管理之后,测试变得更加复杂。因为所有bean都需要在applicationContext中。xml被加载,然后通过@Resource获得。如果每次几乎都完成了整个业务流程,测试将是低效和麻烦的。如果单独编写测试类

转自:https://blog.csdn.net/hgffhh/article/details/83712924

这两天做Web开发,发现通过spring进行对象管理之后,做测试变得复杂了。因为所有的Bean都需要在applicationContext.xml中加载好,之后再通过@Resource去取得。如果每次都要整个业务流做的差不多了再去测试,这样效率很低,也很麻烦。如果单独去写一个测试用类,这样太繁琐了。于是想起Spring有一个测试框架,能够整合JUnit进行测试,于是便拿出来试试~

1. 加入依赖包

  使用Spring的测试框架需要加入以下依赖包:

  • JUnit 4 (官方下载:http://www.junit.org/
  • Spring Test (Spring框架中的test包)
  • Spring 相关其他依赖包(不再赘述了,就是context等包)

2. 创建测试源目录和包

  在此,推荐创建一个和src平级的源文件目录,因为src内的类都是为日后产品准备的,而此处的类仅仅用于测试。而包的名称可以和src中的目录同名,这样由于在test源目录中,所以不会有冲突,而且名称又一模一样,更方便检索。

3. 创建测试类

  创建一个测试用的类,推荐名称为 “被测试类名称 + Test”。

  测试类应该继承与 AbstractJUnit4SpringContextTests 或 AbstractTransactionalJUnit4SpringContextTests

  对于 AbstractJUnit4springcontextTests 和 AbstractTransactionalJUnit4SpringContextTests 类的选择:

  如果再你的测试类中,需要用到事务管理(比如要在测试结果出来之后回滚测试内容),就可以使用AbstractTransactionalJUnit4SpringTests类。事务管理的使用方法和正常使用Spring事务管理是一样的。再此需要注意的是,如果想要使用声明式事务管理,即使用AbstractTransactionalJUnitSpringContextTests类,请在applicationContext.xml文件中加入transactionManager bean:

<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>

  如果没有添加上述bean,将会抛出NoSuchBeanDefinitionException,指明 No bean named 'transactionManager' is definded.

4. 配置测试类

  添加如下内容在class前,用于配置applicationContext.xml文件的位置。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:applicationContext.xml")

5. 创建测试方法

  创建测试用方法,推荐名称为 “被测方法名称+ Test”。

  测试方法上方加入 @Test

6. 通过JUnit 4 执行

  右键方法名,选择则“Run As”→“JUnit Test”即可

附录1:整体测试类文件

复制代码
/* @(#) UserDaoTest.java
*
*/
package com.phj.dao;

import javax.annotation.Resource;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.phj.entity.User;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:applicationContext.xml")
public class UserDaoTest extends AbstractJUnit4SpringContextTests {

@Resource
private UserDaoInterface userDao;

@Test
public void saveTest() {

User user1 = new User();
user1.setUsername("tom");
user1.setPassword("123456");
user1.setNickName("tom");
user1.setEmail("tom@gmail.com");

User user2 = new User();
user2.setUsername("admin");
user2.setPassword("123456");
user2.setNickName("admin");
user2.setEmail("admin@admin.com");

User user3 = new User();
user3.setUsername("feihong");
user3.setPassword("123456");
user3.setNickName("phj");
user3.setEmail("test@gmail.com");

userDao.save(user1);
userDao.save(user2);
userDao.save(user3);
}
}

  OK,到此为止就可以使用Spring的测试框架了。

使用注解时,Junit报错:

 1 java.lang.NoSuchFieldError: NULL  
 2     at org.junit.runners.ParentRunner.<init>(ParentRunner.java:48)  
 3     at org.junit.runners.BlockJUnit4ClassRunner.<init>(BlockJUnit4ClassRunner.java:59)  
 4     at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.<init>(SpringJUnit4ClassRunner.java:104)  
 5     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)  
 6     at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)  
 7     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)  
 8     at java.lang.reflect.Constructor.newInstance(Constructor.java:513)  
 9     at org.junit.internal.requests.ClassRequest.buildRunner(ClassRequest.java:33)  
10     at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:28)  
11     at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.<init>(JUnit4TestReference.java:28)  

经检查是jar包冲突,我在建项目的时候,myeclipse有自动加入junit4,而后面我又自己加入Junit4.8.1。

如果报以下错误,则是junit包版本太低,需要4.5或以上的版本

1 Caused by: java.lang.ClassNotFoundException: org.junit.runners.BlockJUnit4ClassRunner    
2     at java.net.URLClassLoader$1.run(URLClassLoader.java:200)    
3     at java.security.AccessController.doPrivileged(Native Method)    
4     at java.net.URLClassLoader.findClass(URLClassLoader.java:188)    
5     at java.lang.ClassLoader.loadClass(ClassLoader.java:307)    
6     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)    
7     at java.lang.ClassLoader.loadClass(ClassLoader.java:252)    
8     at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)  

其他问题:

@ContextConfiguration({"classpath:applicationContext.xml","classpath:spring/buyer/applicationContext-service.xml"}) 
导入配置文件,这里我的applicationContext配置文件是根据模块来分类的。如果有多个模块就引入多个“applicationContext-service.xml”文件。如果所有的都是写在“applicationContext。xml”中则这样导入: 
@ContextConfiguration(locations = "classpath:applicationContext.xml") 
@RunWith(SpringJUnit4ClassRunner.class)SpringJUnit支持,由此引入Spring-Test框架支持! 
@Transactional这个非常关键,如果不加入这个注解配置,事务控制就会完全失效! 
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)这里的事务关联到配置文件中的事务控制器(transactionManager = "transactionManager"),同时指定自动回滚(defaultRollback = true)。这样做操作的数据才不会污染数据库! 
AbstractTransactionalDataSourceSpringContextTests要想构建这一系列的无污染纯绿色事务测试框架就必须找到这个基类!(即所有事务均不生效)

 1 import com.wonders.frame.ias.service.IasScheduleTask;
 2 import org.junit.Test;
 3 import org.junit.runner.RunWith;
 4 import org.springframework.stereotype.Component;
 5 import org.springframework.test.context.ContextConfiguration;
 6 import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;
 7 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 8 import org.springframework.transaction.annotation.Transactional;
 9 
10 import javax.annotation.Resource;
11 
12 /**
13  * Created with IntelliJ IDEA.
14  * User: zhoushun
15  * Date: 2015/3/30
16  * Time: 12:40
17  * To change this template use File | Settings | File Templates.
18  */
19 @Component
20 @Transactional
21 @RunWith(SpringJUnit4ClassRunner.class)
22 @ContextConfiguration(locations = "classpath*:applicationContext.xml")
23 //public class IasTest extends AbstractTransactionalJUnit4SpringContextTests{
24 public class IasTest extends AbstractJUnit4SpringContextTests {
25     @Resource
26     private IasScheduleTask task;
27 
28     @Test
29     public void taskTest(){
30         task.urgeTask();
31     }
32 }

免责声明:文章转载自《Spring Test 整合 JUnit 4 使用总结》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Access关键字一、Cucumber 环境配置下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Spring源码深度解析之数据库连接JDBC

Spring源码深度解析之数据库连接JDBC   JDBC(Java Data Base Connectivity,Java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC为数据库开发人员提供了一个标准的API,据此可以构建更高级的工具和接口,是数据库开发人员能够用...

CodeIgniter连接数据库及快速入门

一、数据库配置 CodeIgniter 有一个配置文件让你存放数据库连接值(username:用户名,password:密码,database name:数据库名,等等..). 该配置文件位于application/config/database.php. 你也可以通过放置不同的database.php文件到特定的环境配置文件夹里来设置特定环境的数据库连接...

Android自定义组合控件

今天和大家分享下组合控件的使用。很多时候android自定义控件并不能满足需求,如何做呢?很多方法,可以自己绘制一个,可以通过继承基础控件来重写某些环节,当然也可以将控件组合成一个新控件,这也是最方便的一个方法。今天就来介绍下如何使用组合控件,将通过两个实例来介绍。第一个实现一个带图片和文字的按钮,如图所示: 整个过程可以分四步走。第一步,定义一个lay...

springboot中的AOP开发

三步: 1.引入springboot-boot-start-aop jar包 <!--springboot与aop集成jar包--> <dependency> <groupId>org.springframework.boot</groupId>...

C语言中的stdin,stdout,stderr[转]

我们在写C程序时经常遇到printf(),fprintf(),perror(),这些东西到底有什么作用。说到这不得不提及stdin,stdout,stderr。想想,我们在用C去写文件时的操作,File *fp=fopen(),这个fp就是我们向系统申请的,相当于一通往文件的通道。 其实,stdin,stdout,stderr就是这个fp,不过他是随着计算...

jquery对下拉框的操作

<script type="text/javascript"></script> jQuery对下拉框的操作 /获取第一个option的值 $('#test option:first').val(); //最后一个option的值 $('#test option:last').val(); //获取第二个option的值 $('#t...