在Mockito中验证内部代理呼叫

时间:2014-09-05 07:57:55

标签: java spring junit mockito spring-transactions

如何使用Mockito框架验证单元测试中的内部代理调用?

我正在尝试为doAllTasks()方法编写测试,并验证doSingleTask()被调用了一定次数。显然我不能将我的服务分成两部分,因为这些方法具有相同的含义。最简单的解决方案是添加setProxy()方法,但缺点是我需要在服务定义中添加与测试相关的代码。有任何想法吗?

@Service
public class XXXServiceImpl implements XXXService, BeanNameAware {

  private String name;

  private XXXService proxy;

  @Autowired
  private ApplicationContext applicationContext;

  @Override
  public void setBeanName(String name) {
    this.name = name;
  }

  @PostConstruct
  public void postConstruct() {
    proxy = (XXXService)applicationContext.getBean(name);
  }

  @Transactional
  public void doAllTasks(){
    for(...)
      proxy.doSingleTask(...);
  }

  @Transactional(propagation = Propagation.REQUIRES_NEW)
  public void doSingleTask(...){
  }
}

2 个答案:

答案 0 :(得分:2)

解决此问题的一种简单方法是为代理添加setter并使用简单模拟覆盖单元测试中的字段。如果您还添加了一个getter,则可以在测试后将其恢复。

主要缺点是这会阻止您并行运行测试,除非您为此测试创建新的ApplicationContext

另一种方法是给字段@Qualifier,这样您就可以在测试配置中定义两个不同的bean。在制作中,你只需返回单身。

答案 1 :(得分:0)

  1. 注入ApplicationContext的模拟。
  2. 模仿getBean兜售,以返回XXXService
  3. 的模拟
  4. 验证doSingleTask已调用