直接使用 JUnit 测试 Spring 程序存在的不足
- 需要使用硬编码方式手工获取 Bean:在测试用例中,我们需要通过 ApplicationContext.getBean() 的方法从 Spirng 容器中获取需要测试的目标 Bean,并且还要进行造型操作。
- 数据库现场容易遭受破坏:测 试方法可能会对数据库记录进行更改操作,破坏数据库现场。虽然是针对开发数据库进行测试工作的,但如果数据操作的影响是持久的,将会形成积累效应并影响到 测试用例的再次执行。举个例子,假设在某个测试方法中往数据库插入一条 ID 为 1 的 t_user 记录,第一次运行不会有问题,第二次运行时,就会因为主键冲突而导致测试用例执行失败。所以测试用例应该既能够完成测试固件业务功能正确性的检查,又能够 容易地在测试完成后恢复现场,做到踏雪无迹、雁过无痕。
- 不容易在同一事务下访问数据库以检验业务操作的正确性:当测试固件操作数据库时,为了检测数据操作的正确性,需要通过一种方便途径在测试方法相同的事务环境下访问数据库,以检查测试固件数据操作的执行效果。如果直接使用 JUnit 进行测试,我们很难完成这项操作。
Spring 测试框架是专门为测试基于 Spring 框架应用程序而设计的,它能够让测试用例非常方便地和 Spring 框架结合起来,以上所有问题都将迎刃而解。
编写 测试用例
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath*:config/spring/ApplicationContext.xml"},inheritLocations=false)
@Transactional
public class Test1 {
@Autowired
public RedisTemplate redisTemplate;
@Before
public void beforeAction(){
System.out.println("before");
}
@Test
@Rollback(true)
public void testRedis(){
BoundListOperations opt = redisTemplate.boundListOps(Attributes.LinkLstKey_ElevenSelectFive_CQ_Data);
List<Integer> lst = (List<Integer>) opt.index(2);
System.out.println(lst.toString());
}
}
注释:
@RunWith(SpringJUnit4ClassRunner.class) 表示该测试用例是运用junit4进行测试,也可以换成其他测试框架
@ContextConfiguration:
- locations:可以通过该属性手工指定 Spring 配置文件所在的位置,可以指定一个或多个 Spring 配置文件。如下所示:
@ContextConfiguration(locations={“xx/yy/beans1.xml”,” xx/yy/beans2.xml”})
- inheritLocations:是否要继承父测试用例类中的 Spring 配置文件,默认为 true。
@Rollback(false) :表示该测试用例回滚
注意:
操作数据库时,数据并没有真正插入到数据库中。
这是TestContext起的作用,调用事务返回了并没有真正插入数据库。