标签 - 坑

spring    2016-04-29 12:29:25    1478    0    0

问题描述

项目中有一个接口ConfigService,该接口有一个实现类RedisDBConfigService,实现类中有个方法使用了Spring的事务注解@Transactional,代码大致如下:

  1. @Service
  2. public class RedisDBConfigService implements ConfigService {
  3. @Autowired
  4. private DataMapper mapper;
  5. //为了做单元测试,提供一个set方法
  6. public void setDataMapper(DataMapper dataMapper) {
  7. this.mapper = dataMapper;
  8. }
  9. //基于Spring事务控制
  10. @Transactional(rollbackFor = Exception.class)
  11. @Override
  12. public void updateConfig(Data data) throws Exception {
  13. doSomething();
  14. }
  15. }

Spring的事务配置如下:

  1. <!-- 注解方式配置事物 -->
  2. <tx:annotation-driven transaction-manager="transactionManager"/>

这种方式有一个隐含条件就是:Spring为需要事务控制的类创建代理的时候,默认使用JDKProxy来创建。

以上是前提条件。这里要说明一下,程序并没有任何问题,上面的设置也是正确的,可以正确无误运行。那么这样的设置出现了什么问题呢?

问题回放

问题出在单元测试上。如果仅仅测试一下updateConfig方法能否正确运行,是很简单的,也不会有问题。但是单元测试的意义不仅于此,有时候我们需要测试一些异常情况。
比如这个例子中,我需要测试一下DataMapper执行出错抛异常的时候程序的运行结果。为了让程序抛异常,我的思路是自己实现一个DataMapper,然后在方法中直接抛出异常,然后将该DataMapper赋值给RedisDBConfigServ