2012-03-12 5 views
1

により注入し、私は私のクラスに注釈を付けるオブジェクト上で確認してください(Mockitoに)嘲笑:使用私は、私はディのためのGuiceのユニットテストを使用しているGuiceの

私のモジュールで
@Inject 
private DataManager dataManager; 

、私は@Providesメソッドを追加:

@Provides 
@Singleton 
public DataManager getDataManager() { 
    LOG.debug("## init Mocked Data Manager"); 
    DataManager dataManager = mock(DataManager.class); 
    when(dataManager.getObjectCodeList()).thenReturn(getOcList()); 
     .... 
return dataManager; 
} 

そして、私のテストでは、私はspecifと呼ばれるメソッドを呼び出します私は嘲笑オブジェクトが実際のように呼ばれていたことがわかり、

@Test 
public void testDefaultJob() { 
    JobDetail jobDetail = newJob().ofType(OneDayBatchStarter.class) 
      .withIdentity(DAILY_DEFAULT_JOB, Scheduler.DEFAULT_GROUP).build(); 
    try { 
     scheduler.scheduleJob(jobDetail, TriggerBuilder.newTrigger().startNow().build()); 
    } catch (SchedulerException e) { 
     LOG.warn("error during scheduling", e); 
    } 
    verify(dataManager).getObjectCodeList(); 
} 

は、私はいくつかのトレースを追加します:IC法と私はそれを確認したい

"## init Mocked Data Manager " 

"Call object code list ....." 

が、私は持っています確認エラー:

FAILED: testDefaultJob 
Wanted but not invoked: 
dataManager.getObjectCodeList(); 
-> at net.test.batch.TestOneDayBatchStarter.testDefaultJob(TestOneDayBatchStarter.java:177) 
Actually, there were zero interactions with this mock. 

私は何かが恋しくなったのでしょうか、またはGuiceを通してmockito verifyを使うことはできませんでしたか?

答えて

1

PEBKACの問題、GuiceとMockitoは完全に機能します。私はクォーツで仕事を開始しているので、クォーツは新しいスレッドでジョブを起動します。待たずに、嘲笑されたオブジェクトがすでに呼び出されているかどうかを確認します。

は、だから、私は私のロガーのトレースからのsysで見るので、私の@Providesメソッドを呼び出して、この

@Test 
public void testDefaultJob() throws InterruptedException, Exception { 
    JobDetail jobDetail = newJob().ofType(OneDayBatchStarter.class) 
      .withIdentity(DAILY_DEFAULT_JOB, Scheduler.DEFAULT_GROUP).build(); 
    scheduler.scheduleJob(jobDetail, TriggerBuilder.newTrigger().startNow().build()); 
    Thread.currentThread().sleep(500); 
    while (!scheduler.getCurrentlyExecutingJobs().isEmpty()) { 
     Thread.currentThread().sleep(500); 
    } 
    verify(dataManager).getObjectCodeList(); 
} 
+1

おそらく、Quartzが関与していない状態であなたのものをテストするほうがいいでしょうか? –

+0

商品コードのようにクラスをテストしたかったのです。 – Antoine

+1

okですので、統合テストではなく、単体テストではありません:) –

1

これはうまくいくはずです。コードでデバッグしましたか? GuiceはDataManagerのインスタンスを取得するためにプロバイダを呼び出す必要があります。そうでない場合、どのようにインスタンス化されますか?そこにブレークポイントを置き、見つけてください。

+0

Guiceのと私のテスト方法を変更:「##のinit嘲笑データマネージャ」と「コールオブジェクトコードのリストを... ... "。私はおそらく、Guiceが実際のインスタンスの代わりにプロキシされたオブジェクトのようなものを返すので、それはまったく同じオブジェクトであるかどうかを確認するためにトレースを追加するためだと思いました。 – Antoine

関連する問題