怎么获取spring容器器中怎么用test做测试

温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
是建立测试环境,这里创建一个
类的实例;
tearDown()
用于清理资源,如释放打开的文件等等。以
开头的方法被认为是测试方法,
会依次执行
方法中,我们对
的测试分别选择正数,负数和
,如果方法返回值与期待结果相同,则
assertEquals
不会产生异常。
  如果有多个
会创建多个
实例,每次运行一个
tearDown()
前后被调用,因此,不要在一个
  直接运行
Run-&Run As-&JUnit Test
,就可以看到
测试结果:
  绿色表示测试通过,只要有
个测试未通过,就会显示红色并列出未通过测试的方法。可以试图改变
的代码,故意返回错误的结果(比如
return n+1;
),然后再运行
就会报告错误。
提供了下列一些特定的JUnit框架扩展:
AbstractDependencyInjectionSpringContextTests—
这是一个针对所有测试的超类,其具体使用依赖于Spring上下文。
AbstractSpringContextTests—
这是一个针对所有的JUnit测试情形的超类。它使用一个Spring上下文。并且,一般在测试中不是直接使用它,而是使用AbstractDependencyInjectionSpringContextTests或者AbstractTransactionalSpringContextTests这样的派生类。
AbstractTransactionalSpringContextTests—
这是一个针对所有测试的超类,我们一般把它应用在事务相关的测试中。注意,一旦完成每个测试它就会正常地回滚事务;而且你需要重载onSetUpInTransaction和onTearDownInTransaction方法以便手工开始并提交事务。
AbstractTransactionalDataSourceSpringContextTests—
这是AbstractTransactionalSpringContextTests的一个子类,它使用了Spring的基于JDBC的jdbcTemplate工具类。
所有上面这些扩展将极大程度地简化在测试时对于相关操作的依赖性注入和事务管理。
下面就以一个用户
HibernateUserDao
类中的一个方法
getPasswordByName(String userName)
进行测试作为例子,其中的输入就是用户名,输出就是用户密码:
//HibernateUserDAOTest.java
HibernateUserDAOTest
AbstractTransactionalDataSourceSpringContextTests
&&& ApplicationContext
applicationContext
&&& HibernateUserDAO
String[] getConfigLocations()
&&&&&& String[] config=
"file:D:\\RfidStock2\\WebRoot\\WEB-INF\\classes\\applicationContext.xml"
ApplicationContext getContext(String[] filePath)
ClassPathXmlApplicationContext(filePath);
testConfig() {&&&&&&&
assertNotNull(
"spring-mock context has bean init()"
.getConfigLocations());
testGetPasswordByName()
BaseException
=(HibernateUserDAO)getContext(getConfigLocations()).getBean(
"hibernateUserDAO"
assertEquals(
getPasswordByName
main(String[] args)
&&&&&& TestRunner.run((Class&?
TestCase&) HibernateUserDAO.
下由于要驱动
,所以测试类要继承
AbstractTransactionalDataSourceSpringContextTests
类,需要实现一个方法
String[] getConfigLocations()
,用这个方法来获取
的配置文件,然后我通过写
getContext(String[] filePath)
这个方法来获取
的上下文,在这里我们要获取待测试对象有两种方法一种就是
setHibernateUserDAO()
getHibernateUserDAO()
方法,另外一种就是通过上下文提取配置文件中定义的
,然后再获取具体的方法。
这个就是测试结果:
阅读(2872)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在LOFTER的更多文章
loftPermalink:'',
id:'fks_085064',
blogTitle:'在
框架中进行
单元测试',
blogAbstract:'\r\n
测试对于保证软件开发质量有着非常重要的作用,单元测试更是必不可少,\r\n
是一个非常强大的单元测试包,可以对一个\r\n
多个类的单个\r\n
多个方法测试,还可以将不同的\r\n
TestCase\r\n
组合成\r\n
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:0,
publishTime:2,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'。。。',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}运用Maven + Hibernate + SpringTest框架进行单元测试Demo - 编程当前位置:& &&&运用Maven + Hibernate + SpringTest框架进行单元测运用Maven + Hibernate + SpringTest框架进行单元测试Demo&&网友分享于:&&浏览:412次使用Maven + Hibernate + SpringTest框架进行单元测试Demo
使用Maven + Hibernate +
SpringTest框架进行单元测试Demo
之前有同事研究内嵌DB以便提供单元测试所需的数据环境,无果,毕竟难以完全实现各种类型DB的独有特性了。我们采用Mock的方式,进行依赖对象构建。由于系统没有基于依赖注入的进行建构,编写UnitTest很容易成了搭建复杂繁琐的系统环境,背离了“单元”的初衷。我在考虑,采用SpingTest框架为单元测试提供了便利的依赖注入管理设施,使我们从冗余复杂中解放出来。而使用Hibernate对底层持久化进行了屏蔽,很好实现了高层次API单元测试的DB独立性。Maven天生对UnitTest的内建支持,专门搞了个phase叫test,如果真的做到面向接口,测试针对接口,自动化测试也不是不可能。
于是做了一个简单的Demo如下:
Maven管理各种Jar依赖,在这里使用了HsqlDB作为内存DB
Maven POM文件
&project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"&
&modelVersion&4.0.0&/modelVersion&
&groupId&floyd.welsney&/groupId&
&artifactId&orm-demo&/artifactId&
&version&0.0.1-SNAPSHOT&/version&
&packaging&jar&/packaging&
&properties&
&project.build.sourceEncoding&UTF-8&/project.build.sourceEncoding&
&/properties&
&repositories&
&repository&
&id&jboss-hibernate&/id&
&url&https://repository.jboss.org/nexus/content/groups/public/&/url&
&/repository&
&/repositories&
&groupId&org.apache.maven.plugins&/groupId&
&artifactId&maven-compiler-plugin&/artifactId&
&version&2.3.2&/version&
&configuration&
&source&1.6&/source&
&target&1.6&/target&
&/configuration&
&/plugins&
&dependencies&
&dependency&
&groupId&junit&/groupId&
&artifactId&junit&/artifactId&
&version&4.10&/version&
&scope&test&/scope&
&/dependency&
&dependency&
&groupId&org.hsqldb&/groupId&
&artifactId&hsqldb&/artifactId&
&version&2.2.4&/version&
&scope&test&/scope&
&/dependency&
&dependency&
&groupId&org.hibernate&/groupId&
&artifactId&hibernate&/artifactId&
&version&3.2.6.GA&/version&
&/dependency&
&dependency&
&groupId&log4j&/groupId&
&artifactId&log4j&/artifactId&
&version&1.2.16&/version&
&/dependency&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-test&/artifactId&
&version&3.0.6.RELEASE&/version&
&/dependency&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-context&/artifactId&
&version&3.0.6.RELEASE&/version&
&/dependency&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-orm&/artifactId&
&version&3.0.6.RELEASE&/version&
&/dependency&
&/dependencies&
&/project&
创建Spring管理的上下文
Spring配置文件
&bean id="jdbcDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"&
&constructor-arg name="driverClassName" value="org.hsqldb.jdbc.JDBCDriver"&&/constructor-arg&
&constructor-arg name="url" value="jdbc:hsqldb:mem:xdb"&&/constructor-arg&
&constructor-arg name="username" value="SA"&&/constructor-arg&
&constructor-arg name="password" value=""&&/constructor-arg&
&bean id="simpleJdbcTemplate" class="org.springframework.jdbc.core.simple.SimpleJdbcTemplate"&
&constructor-arg name="dataSource" ref="jdbcDataSource"&&/constructor-arg&
&bean id="hibernateSessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"&
&property name="dataSource" ref="jdbcDataSource" /&
&property name="hibernateProperties"&
hibernate.dialect=org.hibernate.dialect.HSQLDialect
hibernate.show_sql=true
hibernate.use_sql_comments=true
hibernate.format_sql=true
&/property&
&property name="mappingResources"&
&value&&/value&
&/property&
&bean id="hibernateTemplate"
class="org.springframework.orm.hibernate3.HibernateTemplate"&
&property name="sessionFactory" ref="hibernateSessionFactory"&&/property&
下面是Java Code
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:applicationContext.xml")
public class BaseSpringManagedContextJunitTest {
protected final Logger logger = LogManager.getLogger(this.getClass());
@Autowired
protected SimpleJdbcTemplate simpleJdbcT
@Autowired
protected HibernateTemplate hibernateT
protected final void execSqlScript(String scriptPath) {
Resource resource = new ClassPathResource(scriptPath);
SimpleJdbcTestUtils.executeSqlScript(simpleJdbcTemplate, resource, false);
public void setUp() {
execSqlScript("floyd/welsney/test/sql/schema.sql");
execSqlScript("floyd/welsney/test/sql/data.sql");
logger.debug("hsqldb is setup");
public void tearDown() {
execSqlScript("floyd/welsney/test/sql/clear.sql");
logger.debug("hsqldb is tearDown");
public void testXXXX() {
logger.debug("Perform unit test");
说明一下代码,
指定◎ContextConfiguration的Location来加载Spring管理的上下文环境配置文件。
◎Autowired说明需要注入的外部依赖。
◎Before用来加载全新的DB Schma和相应的数据。
◎After清理DB环境的脏数据,以为下一次test准备。
最后执行命令mvn test即可,Eclipse下可以Alt+Shift+X+T运行
log4j:WARN No appenders could be found for logger (org.springframework.test.context.junit4.SpringJUnit4ClassRunner).log4j:WARN Please initialize the log4j system properly.使用了Spring unit test 但是加载不到log4j 配置博主知道怎么解决吗 。。。log4j.xml放到src/test/resources下面
发现问题了,xml是可以直接这样引用的,但是在编译的时候xml不会output到target中去。得手动设置一下Test Case需要的外部资源*.xml,*.properties放src/test/resources下面
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有36452人阅读
java(155)
J2EE(95)
工具(27)
原创整理不易,转载请注明出处:
代码下载地址:
一、Spring提供的JUnit框架扩展:
&&&1.&AbstractSpringContextTests:spring中使用spring上下文测试的Junit扩展类,我们一般不会使用这个类来进行单元测试,它是spring内部设计使用到的类
&&&2.&AbstractDependencyInjectionSpringContextTests:这是AbstractSpringContextTests的直接子类,支持依赖spring上下文的测试类,这个类不支持事务。
&&&3.&AbstractTransactionalSpringContextTests:这是&AbstractDependencyInjectionSpringContextTests的直接子类,这个类一般应用在事务相关的测试中,一旦完成每个测试它就会正常地回滚事务,不会真正更新数据库,若要手动设置事务相关操作,你可以重载onSetUpInTransaction和&onTearDownInTransaction方法,以便手工开始并提交事务,或者调用setComplete()方法。这个类也可以在没有事务的情况下,使用这个类。
&&&4.&AbstractTransactionalDataSourceSpringContextTests:这是&AbstractTransactionalSpringContextTests的直接子类,它使用了Spring的基于JDBC的&jdbcTemplate工具类,支持数据库级别的事务。
二、如何在你的TestCase&Class里取得spring&context
&&&&&你的TestCase&Class必须继承的是上述四个AbstractXXXSpringContextTests中的其中一个,那么就必须实现下面这个方法来取得spring&context:
&&&&&&protected&abstract&String[]&getConfigLocations();
&&&&&&例如:
public String[] getConfigLocations() {
String[] configLocations = { &applicationContext.xml&,&hibernate-context.xml& };
return configL
请&注意要加载的context&xml&file的路径问题:上述的代码是基于classpath,因此applicationContext.xml和hibernate-&context.xml必须放在classpath里(方法一是把xml&files放到WEB-INF/classes目录下,另一种方法就是在project&properties里把xml&files的路径加到classpath里)
那么如果你一定要把context&xml&files放到WEB-INF目录下,也是可以的,那么应该基于file(基于file的相对路径是相对于project&root&folder),代码如下:
public String[] getConfigLocations() {
String[] configLocations = { &file:WebContent/WEB-INF/applicationContext.xml&};
return configL
AbstractXXXSpringContextTests就会根据根据getConfigLocations方法返回的context&xml位置的数组来加载并且对加载的Context提供缓存。这是非常重要的,因为如果你在从事一个大项目时,启动时间可能成为一个问题--这不是&Spring自身的开销,而是被Spring容器实例化的对象在实例&化自身时所需要的时间。例如,一个包括50-100个Hibernate映射文件的项目可能需要10-20秒的时间来加载上述的映射文件,如果在运行每个测试fixture里的每个测试案例前都有这样的开销,将导致整个测试工作的延时,最终有可能(实际上很可能)降低效率。
在某种极偶然的情况下,某个测试可能“弄脏”了配置场所,并要求重新加载--例如改变一个bean的定义或者一个应用对象的状态--你可以调用&AbstractDependencyInjectionSpringContextTests&上的&setDirty()&方法来重新加载配置并在执行下一个测试案例前重建application&context
当类&AbstractDependencyInjectionSpringContextTests(及其子类)装载你的Application&Context时,你可以通过Setter方法来注入你想要的来自context的bean,而不需要显式的调用&applicationContext.getBean(XXX)。因为&AbstractDependencyInjectionSpringContextTests会从getConfigLocations()方法指定的配置文件中帮你自动注入
下面的例子就是通过setter方法来获得context里的ProductManager&bean:
public class MyTest extends AbstractDependencyInjectionSpringContextTests {
ProductManager productM
public String[] getConfigLocations() {
String[] configLocations = { &file:WebContent/WEB-INF/applicationContext.xml& };
return configL
public void testGetProduct() {
assertEquals(&tomson&,productManager.getProductByName(&tomson&).getName());
//通过setter方法自动从context里注入productManager bean,而不用显示调用applicationContext.getBean(XXX)
public void setProductManager(ProductManager productManager) {
this.productManager = productM
但是如&果context里有多个bean都定义为一个类型(例如有多个bean都是ProductManager&class类型的),那么对这些bean就无法通过setter方法来自动依赖注入(因为有多个bean同一个类型,不知要自动注入哪个)。在这种情况下&你需要显示的调用applicationContext.getBean(XXX)来注入。如:
public class MyTest extends AbstractDependencyInjectionSpringContextTests {
ProductManager productM
public String[] getConfigLocations() {
String[] configLocations = { &file:WebContent/WEB-INF/applicationContext.xml& };
return configL
public void onSetUp() {
productManager = (ProductManager) applicationContext.getBean(&productManager&);
public void testGetProduct() {
assertEquals(&tomson&,productManager.getProductByName(&tomson&).getName());
如果你的TestCase不使用依赖注入,只要不定义任何setters方法即可。或者你可以继承&AbstractSpringContextTests&--这个&org.springframework.test&包中的根类,而不是继承AbstractDependencyInjectionSpringContextTests(及其子类)。这是因为&AbstractSpringContextTests&只包括用来加载Spring&Context的便利方法但没有自动依赖注入的功能。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:2887411次
积分:30861
积分:30861
排名:第133名
原创:644篇
转载:89篇
评论:1196条
阅读:57733
(2)(12)(18)(19)(13)(28)(29)(28)(31)(29)(2)(1)(2)(1)(2)(9)(5)(31)(30)(31)(31)(33)(26)(22)(1)(1)(3)(2)(1)(2)(1)(6)(30)(11)(3)(3)(11)(7)(11)(14)(1)(16)(43)(15)(71)(54)spring中测试用的新写法
Junit4.8 + springtest.jar - zwxiaole的美好生活 - ITeye技术网站
博客分类:
引用springtest
jar包和其他相关jar包
以及junit4
首先写一个基类 引用AbstractTransactionalJUnit4SpringContextTests
@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(locations = "classpath:applicationContext.xml")public class BaseTestCase extends AbstractTransactionalJUnit4SpringContextTests{
写一个测试类
继承基类 然后加载自己需要的spring.xml文件
测试方法要+ @Test 方法名要 名字+Test
@Resource注入dao接口@ContextConfiguration(locations = "classpath:config/spring/test.xml")public class DaoTest extends BaseTestCase{ @Resource private TestDao testD @Test public void allTest(){
testDao.dotest(); }}
浏览: 99811 次
来自: 宁波&&国之画&&&& &&
版权所有 京ICP备号-2
迷上了代码!

我要回帖

更多关于 spring容器单元测试 的文章

 

随机推荐