不太你要找的人,但我会使用依赖注入的解决方案。我介绍一个新的“中间人”级,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目的。然后它可以验证BackgroundRunner对象的invokeInBackground()方法是以toBeMocked作为参数调用的。
在我所工作的商店,每个人都会同意,BackgroundRunner类(其完整实现,你见上文)十分简单以致它不需要测试。
有感:这是我刚刚发明BackgroundRunner类看起来极像一个ExecutorService的简化版本。
它确实看起来像一个简单的'ExecutorService' - 事实上,你可以有BackgroundRunner [实现'Executor'](http://docs.oracle.com/javase/7/docs/api/java/util/concurrent /Executor.html),它是一个简单定义'execute(Runnable)'的接口。 –