2012-03-12 3 views
1

Я модульное тестирование, я использую Guice для ди, я аннотирование моего класса с:использования проверить на издевались (с Mockito) объектами впрыскивать по Guice

@Guice(modules = { BatchGuiceModule4Test.class }) 
public class TestOneDayBatchStarter { 
} 

Моими объекты хорошо впрыскивается из моего модуля, как эта :

@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 Метод IC и я хочу, чтобы проверить его:

@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(); 
} 

добавить какой-то след, я вижу, что издевались объект был на самом деле называется как:

"## 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?

ответ

1

Проблема PEBKAC, Guice и Mockito работает отлично, я просто запускаю работу с кварцем, поэтому кварц запускает работу в новой ветке. И, не дожидаясь, я проверю, был ли мой издевавшийся объект уже вызван, поэтому моя проблема.

Так я изменить мой метод испытания с этим

@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

, может быть, было бы лучше проверить ваши вещи без участия кварца, нет? –

+0

Я хотел проверить свой класс точно так же, как в моем коде продукта. – Antoine

+1

ОК, поэтому интеграционный тест, а не единичный тест, то :) –

1

Это должно работать, вы отлаживали свой код? Guice должен вызвать вашего провайдера, чтобы получить экземпляр DataManager. Если нет, то как он создается? Поместите там точку перерыва и узнайте.

+0

Guice называют мой @Provides метод, потому что я вижу в SYS из моего регистратора следа: «## инициализации Передразнивало Data Manager» и список кодов объектов «вызовов .. ... ". Я подумал, может быть, потому, что guice возвращает что-то вроде прокси-объекта вместо реального экземпляра, я добавлю трассировку, чтобы проверить, является ли это точно таким же объектом. – Antoine