Spring 2.5 TestContext 测试框架用于测试基于 Spring 的程序,TestContext 测试框架和低版本 Spring 测试框架没有任何关系,是一个全新的基于注解的测试框架,为 Spring 推荐使用该测试框架。
Spring 2.5 相比于 Spring 2.0 所新增的最重要的功能可以归结为以下 3 点:
Spring 推荐开发者使用新的基于注解的 TestContext 测试框架,本文我们将对此进行详细的讲述。
低版本的 Spring 所提供的 Spring 测试框架构在 JUnit 3.8 基础上扩展而来,它提供了若干个测试基类。而 Spring 2.5 所新增的基于注解的 TestContext 测试框架和低版本的测试框架没有任何关系。它采用全新的注解技术可以让 POJO 成为 Spring 的测试用例,除了拥有旧测试框架所有功能外,TestContext 还添加了一些新的功能,TestContext 可以运行在 JUnit 3.8、JUnit 4.4、TestNG 等测试框架下。
在拙作《精通 Spring 2.x — 企业应用开发详解》一书中,笔者曾经指出如果直接使用 JUnit 测试基于 Spring 的程序,将存在以下 4 点明显的不足:
//加载spring配置文件 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); //用getBean()方法获取spring配置文件里定义过的bean,这里不能用注解的方式获得 customerService = (CustomerService)applicationContext.getBean("customerService");
Spring 测试框架是专门为测试基于 Spring 框架应用程序而设计的,它能够让测试用例非常方便地和 Spring 框架结合起来,以上所有问题都将迎刃而解。
这里需要增加了spring-test-2.5.6.jar和junit-4.4.jar两个用于测试的包!
这里尤其要说明一下,由于我们使用注解方式自然要用到JUnit-4.X系列,而Sring-Test对于JUnit有个累人的要求,JUnit的版本必须是4.4,不支持高版本(如4.5、4.7等)。否则,会产生java.lang.ClassNotFoundException: org.junit.Assume$AssumptionViolatedException异常。所以当没有JUnit4.4或其它相关的测试环境时,就导入junit-4.4.jar包
实例:
1 实体类User.java
package org.lab24.entity; import java.io.Serializable; public class User implements Serializable{ public User(){ } private Integer id; private String name; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
对应的hibernate配置文件:
2 接口类:
package org.lab24.service; import java.util.List; import org.lab24.entity.User; public interface UserService { public void save(User user); public List
3 实现类:
package org.lab24.serviceImpl; import java.util.List; import javax.annotation.Resource; import org.hibernate.SessionFactory; import org.lab24.entity.User; import org.lab24.service.UserService; import org.springframework.transaction.annotation.Transactional; //数据库操作一般要开启事业,不然抛异常 @Transactional public class UserServiceImpl implements UserService{ @Resource SessionFactory sessionFactory; public List
4 测试类:
package org.lab24.junit.test; import java.util.Iterator; import java.util.List; import javax.annotation.Resource; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import org.lab24.entity.User; import org.lab24.service.UserService; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @ContextConfiguration(locations = "classpath:applicationContext.xml") @RunWith(SpringJUnit4ClassRunner.class) //@Transactional /* * 这里在注意的是,在spring配置文件里配置事务管理器(org.springframework.orm.hibernate3.HibernateTransactionManager)时, * 当用的bean名字不是transactionManager,如配置成:
5 spring配置文件applicationContext.xml:
6 这里个使用到了ecache,它的配置文件ehcache.xml: