论坛首页 Java企业应用论坛

spring2.5 junit4.x单元测试实例

浏览 8317 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-06-18   最后修改:2010-06-18

先贴上代码吧,

1.基础类,用于加载环境配置信息

package com.xxxx.xxx.oss.base;

import javax.annotation.Resource;
import javax.sql.DataSource;

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

/**
 * [Product]
 *     xxxxxxx
 * [Copyright]
 *     Copyright © 2010 xxxxxxx All Rights Reserved.
 * [FileName]
 *     BaseTest.java
 * [History]
 *     Version  Date      Author     Content
 *     -------- --------- ---------- ------------------------
 *     1.0.0    Jun 17, 2010   zengjr    最初版本
 */

/**
 * <b>Summary: </b> TODO Junit 基础类,加载环境 
 * <b>Remarks: </b> TODO 基础类
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "/com/xxxx/xxxxx/xxxx/config/applicationContext-*.xml" })
public class BaseTest extends AbstractTransactionalJUnit4SpringContextTests {

	/**
	 * <b>Summary: </b> 复写方法 setDataSource
	 * 
	 * @param dataSource
	 * @see org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests#setDataSource(javax.sql.DataSource)
	 */
	@Override
	@Resource(name = "adminDataSource")
	public void setDataSource(DataSource dataSource) {
		// TODO Auto-generated method stub
		super.setDataSource(dataSource);
	}

}

 2.一个实例子类,代码如下

package com.xxxx.xxxx.xxxx.dao;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;

import com.xxxx.xxxx.xxxx.base.BaseTest;
import com.xxxx.xxxx.xxxxx.xxxx.UserSuspectDAO;

  /**
 * [Product]
 *     XXXXX
 * [Copyright]
 *     Copyright © 2010 XXXXX All Rights Reserved.
 * [FileName]
 *     UserSuspectDAOTest.java
 * [History]
 *     Version  Date      Author     Content
 *     -------- --------- ---------- ------------------------
 *     1.0.0    Jun 17, 2010   zengjr    最初版本
 */

/**
 * <b>Summary: </b>
 *      TODO 请在此处简要描述此类所实现的功能。因为这项注释主要是为了在IDE环境中生成tip帮助,务必简明扼要
 * <b>Remarks: </b>
 *        TODO 请在此处详细描述类的功能、调用方法、注意事项、以及与其它类的关系
 */
public class UserSuspectDAOTest extends BaseTest {
	@Autowired
	private UserSuspectDAO userSuspectDAO;
	
	@Before
	public void setUp() throws Exception{
		System.out.println("junit....");
	}
//
	@After
	public void tearDown() throws Exception{
	}
	@Test
	public void testupdateStatus(){
		System.out.println("junit....");
		userSuspectDAO.updateStatus(567);
		
	}
}

 

 常遇到的问题

(上面的重写了setDataSource 是因为在我的项目里有几个dataSource,前台,后台,微博,博客四个dataSource,所以我这要这样明确指定一下

public void setDataSource(DataSource dataSource) 

)

        1.No Jnuit tests found   或者

           The input type of the launch configuration does not exist

           解决办法,鼠标点中test(这个目录与src同级)右键build path--->user as source floder

        2.

java.lang.NoSuchFieldError: NULL
at org.junit.runners.ParentRunner.<init>(ParentRunner.java:48)
at org.junit.runners.BlockJUnit4ClassRunner.<init>(BlockJUnit4ClassRunner.java:59)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.<init>(SpringJUnit4ClassRunner.java:104)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:494)
at org.junit.internal.requests.ClassRequest.buildRunner(ClassRequest.java:33)
at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:28)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.<init>(JUnit4TestReference.java:26)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestClassReference.<init>(JUnit4TestClassReference.java:24)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:40)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:30)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:445)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196) 
 

           解决办法,由于JUNIT的JAR 包冲突,原来用的是junit-4.4.jar,下载替换成junit-4.8.1.jar就OK了

 

依赖包:spring-test.jar,junit-4.8.1.jar

加载配置:除上面这样的写法外还可以这样写,使用classpath:xxxx

            @ContextConfiguration(locations = { " classpath:xxxxx

代码里的@Autowired是自动注入bean。

代码里的@Test告诉junit跑哪个方法为单元测试方法。

 

 

   发表时间:2010-07-05  
lz,我也是跟你做了同样的扩展。但是我在用@Resource指定数据源名称时,总是在装配阶段报错,容器提示说找到了多个匹配的数据源,但是希望只有一个能匹配。
我是在eclipse中直接通过JUnit的环境运行测试脚本做实验的。请问这样重载父类方法是否对环境有什么要求?能贴个配置文件给我看看吗?谢谢!
0 请登录后投票
   发表时间:2010-07-06  
在没有@Resource指定数据源时候我也报过多过数据源的问题,加上去就好了,不知道兄台为什么还会出现这样的错误!
下面是我的配置
	
   <bean id="ibatis2DataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
		<property name="driverClassName" value="${jdbc.twioo.driver}"/>
		<property name="url" value="${jdbc.twioo.url}"/>
		<property name="username" value="${jdbc.twioo.username}"/>
		<property name="password" value="${jdbc.twioo.password}"/>
	</bean>
	
	<!-- 数据源定义,使用Apache DBCP 连接池 -->
	<bean id="adminDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
		<property name="driverClassName" value="${jdbc.admin.driver}"/>
		<property name="url" value="${jdbc.admin.url}"/>
		<property name="username" value="${jdbc.admin.username}"/>
		<property name="password" value="${jdbc.admin.password}"/>
	</bean>
	
	<!-- 数据源定义,使用Apache DBCP 连接池 -->
	<bean id="blogDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
		<property name="driverClassName" value="${jdbc.blog.driver}"/>
		<property name="url" value="${jdbc.blog.url}"/>
		<property name="username" value="${jdbc.blog.username}"/>
		<property name="password" value="${jdbc.blog.password}"/>
	</bean>

0 请登录后投票
   发表时间:2010-07-06  

我们数据源的配置还是有区别的。由于我们是JTA环境,所以在测试环境中使用XA数据源:

<bean id="aDataSource" class="org.enhydra.jdbc.standard.StandardXADataSource" destroy-method="shutdown">
<property name="transactionManager" ref="jotm" />
<property name="driverName" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@192.168.1.2:15221:mic" />
<property name="user" value="xxx" />
<property name="password" value="xxx" />
</bean> 

 我觉得和数据源配置无关啊,我配一个数据源就是OK的。环境是JDK6+Spring2.5。

可能是我忽略了一些额外的配置,能把你xml文件中的其他基础配置贴出来对比一下吗?包括xml声明。可能我有小疏忽……不胜感激!

 

0 请登录后投票
   发表时间:2010-07-07   最后修改:2010-07-07
其它的真没什么变化了,现在把声明部分也粘 一下吧
<?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: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-2.5.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"
	   default-autowire="byName" default-lazy-init="false">

	<!-- 属性文件读入,使用rapid中的JdbcPlaceholderConfigurer则可以从数据库读取配置信息 -->
	<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="locations">
			<list>
				<value>classpath*:jdbc.properties</value>
			</list>
		</property>
	</bean>	


0 请登录后投票
   发表时间:2010-07-08  

哎,还是不行……xml配置中的唯一区别就是你多了个“byName”,不过我加了还是出错。我也没去深究了。自己重新实现一个AbstractTransactionalJUnit4SpringContextTests,修改了注入dataSource的方式:

@TestExecutionListeners({TransactionalTestExecutionListener.class})
@Transactional
public abstract class AbstractTransactionalJUnit4SpringContextTests extends AbstractJUnit4SpringContextTests implements
InitializingBean {
@Override
public void afterPropertiesSet() throws Exception { 
 Assert.notNull(getDataSource());
 this.simpleJdbcTemplate = new SimpleJdbcTemplate(getDataSource());
 }
public abstract DataSource getDataSource();
}

 

自己实现,做了如上的修改。然后再做一个为不同数据源做设置的基类,这个基类继承上文中的AbstractTransactionalJUnit4SpringContextTests:

@ContextConfiguration
public abstract class AbstractAServiceTests extends AbstractTransactionalJUnit4SpringContextTests {
@Autowired
@Qualifier("aDataSource")
private DataSource dataSource;
@Override
public DataSource getDataSource() { return dataSource; }
} 

 

这样解决虽然麻烦了点,但是对写集成测试的程序员而言并不多做事情,而且代码也有灵活性。

0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics