2014-07-21 31 views
0

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

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

下面是一个例子:

public class ToBeMocked { 
    public invokeMeInBackground() { 

     // do stuff 
    } 
} 

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

} 
  • 我怎样才能确保SUT调用invokeMeInBackground()在非主线程?
  • 这可能与其他模拟框架?

我知道我可以检查它是否被调用,并用多少次验证()

回答

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目的。然后它可以验证BackgroundRunner对象的invokeInBackground()方法是以toBeMocked作为参数调用的。

在我所工作的商店,每个人都会同意,BackgroundRunner类(其完整实现,你见上文)十分简单以致不需要测试。


有感:这是我刚刚发明BackgroundRunner类看起来极像一个ExecutorService的简化版本。

+0

它确实看起来像一个简单的'ExecutorService' - 事实上,你可以有BackgroundRunner [实现'Executor'](http://docs.oracle.com/javase/7/docs/api/java/util/concurrent /Executor.html),它是一个简单定义'execute(Runnable)'的接口。 –

相关问题