使用 Spring 2.5 TestContext 测试框架

上一篇 / 下一篇  2008-07-07 21:29:45 / 个人分类:spring资料

  • 文件版本: V1.0
  • 开发商: 本站原创
  • 文件来源: 本地
  • 界面语言: 简体中文
  • 授权方式: 免费
  • 运行平台: Win9X/Win2000/WinXP

yY @]&x K0IT168 技术文章】Spring 2.5 TestContext 测试框架用于测试基于 Spring 的程序,TestContext 测试框架和低版本 Spring 测试框架没有任何关系,是一个全新的基于注解的测试框架,为 Spring 推荐使用该测试框架。51Testing软件测试网\NZCpN?-F^6I

8f!q;Q5?:_LF`0概述
6fy&M7F e7PWLNY051Testing软件测试网8yS&VuFd5ep
Spring 2.5 相比于 Spring 2.0 所新增的最重要的功能可以归结为以下 3 点:51Testing软件测试网f,a;Il,d
51Testing软件测试网 b(uiy0c9^\
基于注解的 IoC 功能;
/y"[m^*g pV0基于注解驱动的 Spring MVC 功能;51Testing软件测试网/FR3{ Y,Y?&U#Z
基于注解的 TestContext 测试框架。
o?VV]0Spring 推荐开发者使用新的基于注解的 TestContext 测试框架,本文我们将对此进行详细的讲述。
8W EU0L[R#S!nq!k051Testing软件测试网D.d*U9f5^#O
低版本的 Spring 所提供的 Spring 测试框架构在 JUnit 3.8 基础上扩展而来,它提供了若干个测试基类。而 Spring 2.5 所新增的基于注解的 TestContext 测试框架和低版本的测试框架没有任何关系。它采用全新的注解技术可以让 POJO 成为 Spring 的测试用例,除了拥有旧测试框架所有功能外,TestContext 还添加了一些新的功能,TestContext 可以运行在 JUnit 3.8、JUnit 4.4、TestNG 等测试框架下。
&J7v%q cj]1w051Testing软件测试网 ?;^r},Gx(K:M
直接使用JUnit 测试Spring 程序存在的不足51Testing软件测试网[+~ w%?*c2x9Nu
51Testing软件测试网q q]cT2d
在拙作《精通 Spring 2.x — 企业应用开发详解》一书中,笔者曾经指出如果直接使用 JUnit 测试基于 Spring 的程序,将存在以下 4 点明显的不足:51Testing软件测试网 a%oc+Z3Y)T&d,y
51Testing软件测试网!X,q3G:R2Ts
导致 Spring 容器多次初始化问题:根据 JUnit 测试用例的调用流程,每执行一个测试方法都会重新创建一个测试用例实例并调用其 setUp() 方法。由于在一般情况下,我们都在 setUp() 方法中初始化 Spring 容器,这意味着测试用例中有多少个测试方法,Spring 容器就会被重复初始化多少次。51Testing软件测试网B2d m8Q+YL+QX

l-EZ p4m xq-s0需要使用硬编码方式手工获取 Bean:在测试用例中,我们需要通过 ApplicationContext.getBean() 的方法从 Spirng 容器中获取需要测试的目标 Bean,并且还要进行造型操作。
R?%lD6\@bq;^051Testing软件测试网6Yl'Mzoi
数据库现场容易遭受破坏:测试方法可能会对数据库记录进行更改操作,破坏数据库现场。虽然是针对开发数据库进行测试工作的,但如果数据操作的影响是持久的,将会形成积累效应并影响到测试用例的再次执行。举个例子,假设在某个测试方法中往数据库插入一条 ID 为 1 的 t_user 记录,第一次运行不会有问题,第二次运行时,就会因为主键冲突而导致测试用例执行失败。所以测试用例应该既能够完成测试固件业务功能正确性的检查,又能够容易地在测试完成后恢复现场,做到踏雪无迹、雁过无痕。51Testing软件测试网't F oY N"OE _
51Testing软件测试网W$yx%DMb4V
不容易在同一事务下访问数据库以检验业务操作的正确性:当测试固件操作数据库时,为了检测数据操作的正确性,需要通过一种方便途径在测试方法相同的事务环境下访问数据库,以检查测试固件数据操作的执行效果。如果直接使用 JUnit 进行测试,我们很难完成这项操作。
npwQ6b0
;a:w&@.Pva0Spring 测试框架是专门为测试基于 Spring 框架应用程序而设计的,它能够让测试用例非常方便地和 Spring 框架结合起来,以上所有问题都将迎刃而解。

r_Q{:{0

c8@JB~+V%t0一个需要测试的 Spring 服务类
U:v'T%?NnX7o^051Testing软件测试网T7uX9mwQacH
在具体使用 TextContext 测试框架之前,我们先来认识一下需要测试的 UserService 服务类。UserService 服务类中拥有一个处理用户登录的服务方法,其代码如下所示:
6J;C3S+`z;nd"f0
g:HqQj?;?0清单1. UserService.java 需要测试的服务类51Testing软件测试网t(z ]1{6j8B8oq UZ
51Testing软件测试网qV2iU2bv;I y[Ej

package com.baobaotao.service; import com.baobaotao.domain.LoginLog; import com.baobaotao.domain.User; import com.baobaotao.dao.UserDao; import com.baobaotao.dao.LoginLogDao;publicclassUserService{privateUserDao userDao;privateLoginLogDao loginLogDao;publicvoidhandleUserLogin(User user) { user.setCredits(5+user.getCredits()); LoginLog loginLog=newLoginLog(); loginLog.setUserId(user.getUserId()); loginLog.setIp(user.getLastIp()); loginLog.setLoginTime(user.getLastVisit()); userDao.updateLoginInfo(user); loginLogDao.insertLoginLog(loginLog); }//省略get/setter方法}

+q%zBQwv0UserService 需要调用 DAO 层的 UserDao 和 LoginLogDao 以及 User 和 LoginLog 这两个 PO 完成业务逻辑,User 和 LoginLog分别对应 t_user 和 t_login_log 这两张数据库表。51Testing软件测试网 ]6lCLS/^|
51Testing软件测试网*fP lqd^
在用户登录成功后调用 UserService 中的 handleUserLogin() 方法执行用户登录成功后的业务逻辑:51Testing软件测试网0~b8FhaG^qf

hW6R!g$?X0登录用户添加 5 个积分(t_user.credits);
g;r5Q[Q Py$K&y0登录用户的最后访问时间(t_user.last_visit)和 IP(t_user.last_ip)更新为当前值;51Testing软件测试网^[k$T?"^ D
日志表中(t_login_log)中为用户添加一条登录日志。
"C9H|%NO+].I0这是一个需要访问数据库并存在数据更改操作的业务方法,它工作在事务环境下。下面是装配该服务类 Bean 的 Spring 配置文件:51Testing软件测试网4o ue"lxhbW\

5I2eb&B'a&i!p4OY9x0清单2. applicationContext.xml:Spring 配置文件,放在类路径下
G#Q'Iz0o%B~ kc0

v2h9{zN;Rgf0
<?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:tx="http://www.springframework.org/schema/tx"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.5.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-2.5.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-2.5.xsd"><!--配置数据源--><bean id="dataSource"class="org.apache.commons.dbcp.BasicDataSource"destroy-method="close"p:driverClassName="com.mysql.jdbc.Driver"p:url="jdbc:mysql://localhost/sampledb"p:username="root"p:password="1234"/><!--配置Jdbc模板--><bean id="jdbcTemplate"class="org.springframework.jdbc.core.JdbcTemplate"p:dataSource-ref="dataSource"/><!--配置dao--><bean id="loginLogDao"class="com.baobaotao.dao.LoginLogDao"p:jdbcTemplate-ref="jdbcTemplate"/><bean id="userDao"class="com.baobaotao.dao.UserDao"p:jdbcTemplate-ref="jdbcTemplate"/><!--事务管理器--><bean id="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"p:dataSource-ref="dataSource"/><bean id="userService"class="com.baobaotao.service.UserService"p:userDao-ref="userDao"p:loginLogDao-ref="loginLogDao"/><!--使用aop/tx命名空间配置事务管理,这里对service包下的服务类方法提供事务--><aop:config><aop:pointcut id="jdbcServiceMethod"expression="within(com.baobaotao.service..*)"/><aop:advisor pointcut-ref="jdbcServiceMethod"advice-ref="jdbcTxAdvice"/></aop:config><tx:advice id="jdbcTxAdvice"transaction-manager="transactionManager"><tx:attributes><tx:method name="*"/></tx:attributes></tx:advice></beans>

F6QzI Zg7k'ZG0UserService 所关联的 DAO 类和 PO 类都比较简单,请参看本文附件的程序代码。在着手测试 UserSerivce 之前,需要将创建数据库表,你可以在附件的 schema 目录下找到相应的 SQL 脚本文件。

;i0U)~)p,]Cok051Testing软件测试网YzQ[:U

下面我们为 UserService 编写一个简单的测试用例类,此时的目标是让这个基于 TestContext 测试框架的测试类运行起来,我们将在后面逐步完善这个测试用例。
HZ3B @XY0
H'i],\j3t?x0清单3.TestUserService.java: 基于注解的测试用例
'lu%Be&I,B051Testing软件测试网&]!{Q]8dSx.j K

package com.baobaotao.service; import org.springframework.test.context.junit4. AbstractTransactionalJUnit4SpringContextTests; import org.springframework.test.context.ContextConfiguration; import org.springframework.beans.factory.annotation.Autowired; import org.junit.Test; import com.baobaotao.domain.User; import java.util.Date; @ContextConfiguration//publicclassTestUserService extends AbstractTransactionalJUnit4SpringContextTests { @Autowired//privateUserService userService; @Test//publicvoidhandleUserLogin(){ User user=newUser(); user.setUserId(1); user.setLastIp("127.0.0.1"); Date now=newDate(); user.setLastVisit(now.getTime()); userService.handleUserLogin(user); } }
51Testing软件测试网G!?2gF0T0x.^

这里,我们让 TestUserService 直接继承于 Spring 所提供的 AbstractTransactionalJUnit4SpringContextTests 的抽象测试类,稍后本文将对这个抽象测试类进行剖析,这里你仅须知道该抽象测试类的作用是让 TestContext 测试框架可以在 JUnit 4.4 测试框架基础上运行起来就可以了。
4T s ?1E].bD051Testing软件测试网8V q5ZIw We
在 ① 处,标注了一个类级的 @ContextConfiguration 注解,这里 Spring 将按 TestContext 契约查找 classpath:/com/baobaotao/service/TestUserService-context.xml 的 Spring 配置文件,并使用该配置文件启动 Spring 容器。@ContextConfiguration 注解有以下两个常用的属性:51Testing软件测试网OR p2sa
51Testing软件测试网$A@U$y@
locations:可以通过该属性手工指定 Spring 配置文件所在的位置,可以指定一个或多个 Spring 配置文件。如下所示:
7B+K CV%[n"iF%~8@051Testing软件测试网LF;}z7a5[

;_:e1W]w+S\6TU0
@ContextConfiguration(locations={“xx/yy/beans1.xml”,” xx/yy/beans2.xml”})

Td(ht"v0inheritLocations:是否要继承父测试用例类中的 Spring 配置文件,默认为 true。如下面的例子:
:^IE\3lO4TY*m0

C4Uto6w(y/k`MaT0
@ContextConfiguration(locations={"base-context.xml"})publicclassBaseTest {//...} @ContextConfiguration(locations={"extended-context.xml"})publicclassExtendedTest extends BaseTest {//...}
51Testing软件测试网9{q:w HA$H8h1n

如果 inheritLocations 设置为 false,则 ExtendedTest 仅会使用 extended-context.xml 配置文件,否则将使用 base-context.xml 和 extended-context.xml 这两个配置文件。
_SfZvp051Testing软件测试网JK!Q K#_:\Lj8C
② 处的 @Autowired 注解让 Spring 容器自动注入 UserService 类型的 Bean。而在 ③ 处标注的 @Test 注解则让 handleUserLogin() 方法成为一个 JUnit 4.4 标准的测试方法, @Test 是 JUnit 4.4 所定义的注解。
h PL'`%O"Ul@051Testing软件测试网#P{ KYJ+Y.Vj5`s
在运行 TestUserService 测试类之前,让我们先看一下 TestUserService-context.xml 配置文件的内容:51Testing软件测试网s#B4[&Y$H
51Testing软件测试网 he#X Bi { p~0k
清单 4.TestUserService 所引用的 Spring 配置文件
j\F]:M;h0

n0pT/| bN)V9s0
<?xml version="1.0"encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.5.xsd"><!--① 引入清单1定义的Spring配置文件--><import resource="classpath:/applicationContext.xml"/></beans>
51Testing软件测试网 _;\8yr*YNCgtQ

在 ① 处引入了清单 1 中定义的 Spring 配置文件,这样我们就可以将其中定义的 UserService Bean 作为测试固件注入到 TestUserService 中了。
T"T:UAp0Eq051Testing软件测试网+{$u.j5_;Z
在你的 IDE 中(Eclipse、JBuilder、Idea 等),将 JUnit 4.4 类包引入到项目工程中后,在 TestUserService 类中点击右键运行该测试类,将发现 TestUserService 已经可以成功运行了,如 图 1 所示:51Testing软件测试网GVy5D2MN!x[
51Testing软件测试网 u C:r9psQ#fHi
图 1. 在 Eclipse 6.0 中运行 TestUserService51Testing软件测试网 X$@T#t SW
51Testing软件测试网3nH8P|0mIa
51Testing软件测试网#Z%pjs(a/B@
TestUserService 可以正确运行,说明其 userService 这个测试固件已经享受了 Spring 自动注入的功能。在运行该测试用例后,到数据库中查看 t_user 表和 t_login_log 表,你会发现表数据和测试前是一样的!这说明虽然我们在清单 3 的 handleUserLogin() 测试方法中执行了 userService.handleUserLogin(user) 的操作,但它并没有对数据库现场造成破坏:这是因为 Spring 的在测试方法返回前进行了事务回滚操作。51Testing软件测试网2}'?3{7s2D;Cv3u+|RF*E,Z
51Testing软件测试网k(@'tq-P4Dx
虽然 TestUserService.handleUserLogin() 测试方法已经可以成功运行,但是它在测试功能上是不完善的,读者朋友可以已经发现了它存在以下两个问题:51Testing软件测试网W$pmT~ LP'J

-Y b$K7r"w{j,F1v0我们仅仅执行了 UserService#handleUserLogin(user) 方法,但验证该方法执行结果的正确性。
*?bZ/W;O+k0在测试方法中直接使用 ID 为 1 的 User 对象进行测试,这相当于要求在数据库 t_user 表必须已经存在 ID 为 1 的记录,如果 t_user 中不存在这条记录,将导致测试方法执行失败。51Testing软件测试网,@"d4go D6bN6@

51Testing软件测试网{3c"fYPB`$X

准备测试数据并检测运行结果
CwvHzXxl0r0
)n_|&\4xs sN^0在这节里,我们将着手解决上面所提出的两个问题,在测试用例中准备测试数据并到数据库中检测业务执行结果的正确性。
/}H#r7] ez{(S)i*O0
7m[L c3U6|:uG0准备测试数据51Testing软件测试网+_Eg9c$qL U!{4t
51Testing软件测试网yDEFZ'F~
相比于在测试方法中直接访问预定的数据记录,在测试方法执行前通过程序准备一些测试数据,然后在此基础上运行测试方法是比较好的策略,因为后者不需要对数据库的状态做假设。在 TestContext 中,你可以通过使用 JUnit 4.4 的 @Before 注解达到这个目的,请看下面的代码:51Testing软件测试网e V)y6S5W6D ?J Q
51Testing软件测试网 mOi\&iw
清单5. 为测试方法准备数据
z_(e m6h c4p0

(N?_%z"|#[8CT8M0
package com.baobaotao.service; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.Date; import org.junit.Before; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.PreparedStatementCreator; import org.springframework.jdbc.support.GeneratedKeyHolder; import org.springframework.jdbc.support.KeyHolder; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4. AbstractTransactionalJUnit4SpringContextTests; import com.baobaotao.dao.UserDao; import com.baobaotao.domain.User; @ContextConfigurationpublicclassTestUserService extends AbstractTransactionalJUnit4SpringContextTests { @AutowiredprivateUserService userService; @AutowiredprivateUserDao userDao;privateintuserId; @Before//① 准备测试数据publicvoidprepareTestData() { final String sql="insert into t_user(user_name,password) values('tom','1234')"; simpleJdbcTemplate.update(sql); KeyHolder keyHolder=newGeneratedKeyHolder(); simpleJdbcTemplate.getJdbcOperations().update(newPreparedStatementCreator() {publicPreparedStatement createPreparedStatement(Connection conn) throws SQLException { PreparedStatement ps=conn.prepareStatement(sql);returnps; } }, keyHolder); userId=keyHolder.getKey().intValue();//①-1 记录测试数据的id} @TestpublicvoidhandleUserLogin(){ User user=userDao.getUserById(userId);//② 获取测试数据user.setLastIp("127.0.0.1"); Date now=newDate(); user.setLastVisit(now.getTime()); userService.handleUserLogin(user); } }

z7K2z0f5A }"}3x0JUnit 4.4 允许通过注解指定某些方法在测试方法执行前后进行调用,即是 @Before 和 @After 注解。在 Spring TestContext 中,标注 @Before 和 @After 的方法会在测试用例中每个测试方法运行前后执行,并和测试方法运行于同一个事务中。在 清单 5 中 ① 处,我们给 prepareTestData() 标注上了 @Before 注解,在该方法中准备一些测试数据,以供 TestUserService 中所有测试方法使用(这里仅有一个 handleUserLogin() 测试方法)。由于测试方法运行后,整个事务会被回滚,在 prepareTestData() 中插入的测试数据也不会持久化到数据库中,因此我们无须手工删除这条记录。51Testing软件测试网,u~ F:th4].Q

'QeUWA.[0p0标注 @Before 或 @After 注解的方法和测试方法运行在同一个事务中,但有时我们希望在测试方法的事务开始之前或完成之后执行某些方法以便获取数据库现场的一些情况。这时,可以使用 Spring TestContext 的 @BeforeTransaction 和 @AfterTransaction 注解来达到目录(这两个注解位于 org.springframework.test.context.transaction 包中)。
?.]'DX!sAp-B1lq051Testing软件测试网g[)t"Qc
虽然大多数业务方法都会访问数据库,但也并非所有需要测试的业务方法都需要和数据库打交道。而在默认情况下,继承于 AbstractTransactionalJUnit4SpringContextTests 测试用例的所有测试方法都将工作于事务环境下,你可以显式地通过 @NotTransactional 注解,让测试方法不工作于事务环境下。51Testing软件测试网 taHY mK

`1Vl'O)^ g @Bs7^0prepareTestData() 方法中使用到了 simpleJdbcTemplate 对象访问操作数据库,该对象在 AbstractTransactionalJUnit4SpringContextTests 抽象类中定义,只要 Spring 容器有配置数据源,simpleJdbcTemplate 就会被自动创建。同时该抽象类中还拥有一个 Spring 容器引用:applicationContext,你可以借助该成员变量访问 Spring 容器,执行获取 Bean,发布事件等操作。
$R]Qy1HA)u8U+PE0
dM5Mdi2iO,t0此外,AbstractTransactionalJUnit4SpringContextTests 还提供了若干个访问数据库的便捷方法,说明如下:51Testing软件测试网X%K} J~ eD c"s N?

0P;cMU S#T(Pw+?5Tw0protected int countRowsInTable(String tableName) :计算数据表的记录数。
&?#h0AV |k \d'~3\0protected int deleteFromTables(String... names):删除表中的记录,可以指定多张表。51Testing软件测试网Q3z4e:jtp8Wt\
protected void executeSqlscrīpt(String sqlResourcePath, boolean continueOnError):执行 SQL 脚本文件,在脚本文件中,其格式必须一个 SQL 语句一行。
}9qYd]"H Fs0在测试方法 handleUserLogin() 的 ② 处,我们通过 userDao 获取 prepareTestData() 添加的测试数据,测试方法在测试数据的基础上执行业务逻辑。使用这种测试方式后,在任何情况下运行 TestUserService 都不会发生业务逻辑之外的问题。51Testing软件测试网!x.JSWt#x

检验业务逻辑的正确性51Testing软件测试网S)T!HNM
51Testing软件测试网Q;V x*f|1L.dZ
到目前为此,TestUserService 的 handleUserLogin() 测试方法仅是简单地执行 UserService#handleUserLogin() 业务方法,但并没有在业务方法执行后检查执行结果的正确性,因此这个测试是不到位的。也就是说,我们必须访问数据库以检查业务方法对数据更改是否成功:这包括积分(credits)、最后登录时间(last_visit)、最后登录 IP(last_ip)以及登录日志表中的登录日志记录(t_login_log)。下面,我们补充这项重要的检查数据正确性的工作:51Testing软件测试网2wp$D S%B9bR+X4V

/E?!\;]#k'dRH&{0清单5. 检验业务方法执行结果的正确性51Testing软件测试网BGL7d.`'w
@TestpublicvoidhandleUserLogin(){ User user=userDao.getUserById(userId); user.setLastIp("127.0.0.1"); Date now=newDate(); user.setLastVisit(now.getTime()); userService.handleUserLogin(user);//------------------以下为业务执行结果检查的代码---------------------User newUser=userDao.getUserById(userId); Assert.assertEquals(5, newUser.getCredits());//①检测积分//①检测最后登录时间和IPAssert.assertEquals(now.getTime(), newUser.getLastVisit()); Assert.assertEquals("127.0.0.1",newUser.getLastIp());//③检测登录记录String sql="select count(1) from t_login_log where user_id=?"+“ and login_datetime=?and ip=?";intlogCount=simpleJdbcTemplate.queryForInt(sql, user.getUserId(), user.getLastVisit(),user.getLastIp()); Assert.assertEquals(1, logCount); }
在业务方法执行后,我们查询数据库中相应记录以检查是否和期望的效果一致,如 ① 和 ② 所示。在 ③ 处,我们使用 SimpleJdbcTemplate 查询 t_login_log,以检查该表中是否已经添加了一条用户登录日志。
7~A_ |ITAD0
wBH5NR&w8S4o0注意:由于我们的 DAO 层采用 Spring JDBC 框架,它没有采用服务层缓存技术,所以可以使用 DAO 类返回数据库中的数据。如果采用 Hibernate 等 ORM 框架,由于它们采用了服务层缓存的技术,为了获取数据库中的相应数据,需要在业务方法执行后调用 HibernateTemplate.flush() 方法,将缓存中的对象同步到数据库中,这时才可以通过 SimpleJdbcTemplate 在数据库中访问业务方法的执行情况。
1x3GE1M2H051Testing软件测试网:[qWsq n
小结51Testing软件测试网 XRn4HEW8CZ'D

,|/c%Ou A;PWj0我们通过对一个典型的涉及数据库访问操作的 UserService 服务类的测试,讲述了使用 Spring 2.5 TestContext 测试框架进行集成测试的各项问题,这包括测试固件的自动注入、事务自动回滚、通过 SimpleJdbcTemplate 直接访问数据库以及测试数据准备等问题。51Testing软件测试网4K$H_+~LN'N

8r8Q ]k$_4^]7F0在通过一个实际例子的学习后,我们对如何使用 TestContext 测试框架有了一个具体的认识,在此基础上我们对 Spring TestContext 测试框架体系结构进行了分析,然后剖析了 Spring 为 TestContext 嫁接到 JUnit 4.4 测试框架上所提供的两个抽象测试用例类。
k:R1e!AZb!a C:r%T0
4e GP4g t2p&pd!Z0Spring 的 TestContext 测试框架不但可以整合到 JUnit 4.4 测试框架上,而且还可以整合到 JUnit 3.8 以及 TestNG 等测试框架上。目前已经提供了对 JUnit 3.8 以及 TestNG 的支持,你可以分别在 org.springframework.test.context.junit38 和 org.springframework.test.context.testng 包下找到整合的帮助类。

TAG: spring资料

 

评分:0

我来说两句

Open Toolbar