没有在某个线程上调用验证方法

时间:2014-07-21 14:40:55

标签: java multithreading mocking mockito

我正在使用Mockito来模拟SUT使用的类。我想检查在某个线程(主)上没有调用该模拟类的某个方法。

  • 我该怎么做?
  • 有可能吗?

以下是一个例子:

public class ToBeMocked {
    public invokeMeInBackground() {

        // do stuff
    }
}

public class SUT {
      new Thread(new Runnable() {
        @Override
        public void run() {
            toBeMocked.invokeMeInBackground();
        }
    }).start();

}
  • 如何确保SUT在非主线程上调用invokeMeInBackground()?
  • 这可以与其他模拟框架一起使用吗?

我知道我可以通过verify()

检查它是否被调用了多少次

1 个答案:

答案 0 :(得分:0)

不是你想要的解决方案,但我会使用依赖注入。我将介绍一个新的“中间人”类BackgroundRunner,以简化测试:

public interface InvokableInBackground {
    public void invokeMeInBackground();
}

public class ToBeMocked implements InvokableInBackground {
    public void invokeMeInBackground() {
        // do stuff
    }
}

public class BackgroundRunner {
    public void invokeInBackground(InvokableInBackground invokableInBackground) {
      new Thread(new Runnable() {
        @Override
        public void run() {
            invokableInBackground.invokeMeInBackground();
        }
    }).start();
    }
}

public class SUT {
      final BackgroundRunner backgroundRunner;
      final ToBeMocked toBeMocked;

      SUT(BackgroundRunner backgroundRunner, ToBeMocked toBeMocked) {
          this.backgroundRunner = backgroundRunner;
          this.toBeMocked = toBeMocked;
      }

      void methodToBeTested(...) {
          ToBeMocked toBeMocked = ...;
          backgroundRunner.invokeInBackground(toBeMocked);
      }
}

然后,您的单元测试将提供两个测试双精度数,一个用于ToBeMocked对象,另一个用于BackgroundRunner对象。然后它可以验证使用toBeMocked作为参数调用BackgroundRunner对象的invokeInBackground()方法。

在我工作的商店中,每个人都同意BackgroundRunner类(其上面的完整的实现)足够简单,不需要测试。


事后补充:我刚刚发明的BackgroundRunner类看起来非常像ExecutorService的简单版本。