模拟具有setListener(...)的依赖项

时间:2015-02-27 23:51:03

标签: java multithreading testing mocking mockito

我的测试类有一些依赖项。所有这些都提供setListener()作为从非阻塞操作接收通知的方式。

我实现了一种阻塞方法,该方法聚合来自所有非阻塞操作的结果。这意味着我必须使用这种setListener()方法注册监听器,并等待回调。

我应该如何在单元测试中模拟/伪造这些依赖项? 我可以将它们子类化并实现setListener()并根据需要触发回调。但是,让我们说其中一些代表是final类。另外,我认为可以从Mockito中使用一些东西吗?

概念代码(未经测试):

public void blockingMethod() {
  CountDownLatch signal = new CountDownLatch(2);

  dep1.setListener(new Dep1Listener() {
    @Override public onResult(int result) {
      signal.countDown();
    }
  });
  dep1.calculateValue1();

  dep2.setListener(new Dep2Listener() {
    @Override public onResult(int result) {
      signal.countDown();
    }
  });
  dep2.calculateValue2();

  signal.await();
  return combinedResult;
}

1 个答案:

答案 0 :(得分:1)

我会创建返回固定值的依赖项的具体实现。我不会创建现有类的子类,而是创建接口的最小实现。如果没有为依赖项定义接口,请创建它们。

模拟可能有效,但测试将更难阅读。一旦模拟需要保持一个参数(即你的听众)并在以后做一些事情,它就会变得具有挑战性。