использовать проверку на поддельных (с Mockito) объектах, вводимых путаницей - PullRequest
1 голос
/ 12 марта 2012

У меня есть модульный тест, я использую guice для di, я комментирую свой класс с помощью:

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

И в своем тесте я вызываю метод, который вызвал определенный метод, и я хочу проверить его:

@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.

Я что-то пропустил, или невозможно использовать mockito для проверки через Guice?

Ответы [ 2 ]

1 голос
/ 14 марта 2012

Проблема 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 голос
/ 12 марта 2012

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

...