Как использовать JMock для проверки макетов внутри метода? - PullRequest
2 голосов
/ 14 апреля 2011

У меня возникают проблемы с определением способа макетирования определенного фрагмента кода.

Вот мой метод:

public void sendNotifications(NotificationType type, Person person)
    {
        List<Notification> notifications = findNotifications(type);
        for(Notification notification : notifications)
        {
            notification.send(person);
        }
    }

Я бы хотел использовать JMock для проверки этогоВызывается findNotifications, и он возвращает ожидаемое значение, и вызывается функция send ().

findNotifications вызывает мой Dao, который является поддельным.Уведомление - это абстрактный класс.

У меня есть такой тестовый модуль, но он явно не работает.Он удовлетворяет первым двум ожиданиям, но не более.

    @Test
public void testSendNotifications2()
{
    final Person person = new Person();
    notificationEntries.add(createEntry1);

    Mockery context = new JUnit4Mockery() {{ setImposteriser(ClassImposteriser.INSTANCE); }};
    final NotificationDao dao = context.mock(NotificationDao.class, "notificationDao");
    final Notification mockedNotification = context.mock(V2ADTNotification.class, "mockNotification");
    notifications.add(mockedNotification);

    final NotifierServiceImpl mockedService = context.mock(NotifierServiceImpl.class, "mockedService");

    //NotifierService service = new NotifierServiceImpl(dao);

    context.checking(new Expectations() {
        {
            one(mockedService).setDao(dao);
            one(mockedService).sendNotifications(NotificationType.CREATE, person);
            one(mockedService).findNotifications(NotificationType.CREATE);
            one(dao).getByNotificationType(NotificationType.CREATE);
            will(returnValue(notificationEntries)); 
            will(returnValue(notifications));

            one(mockedNotification).send(person);
        }
    });

    mockedService.setDao(dao);
    mockedService.sendNotifications(NotificationType.CREATE, person);
    context.assertIsSatisfied();
}

    mockedService.sendNotifications(NotificationType.CREATE, person);
    context.assertIsSatisfied();
}

Как я могу заставить это работать так, как я хочу?

Другой способ, которым я пытался.Он удовлетворяет первым двум ожиданиям, но не отправляет.

@Test
public void testSendNotifications()
{
    final Person person = new Person();
    notificationEntries.add(createEntry1);

    Mockery context = new JUnit4Mockery() {{ setImposteriser(ClassImposteriser.INSTANCE); }};
    final NotificationDao dao = context.mock(NotificationDao.class, "notificationDao");
    final Notification mockedNotification = context.mock(V2ADTNotification.class, "mockNotification");

    NotifierService service = new NotifierServiceImpl(dao);

    context.checking(new Expectations() {
        {
            one(dao).getByNotificationType(NotificationType.CREATE);
            will(returnValue(notificationEntries)); 

            one(mockedNotification).send(person);
        }
    });

    service.sendNotifications(NotificationType.CREATE, person);
    context.assertIsSatisfied();
}

Я довольно новичок в использовании Jmock, поэтому я прошу прощения, если мне кажется, что я ничего не понимаю о том, что яя делаю (я не).

1 Ответ

4 голосов
/ 14 апреля 2011

тестирование макетов методов внутри метода.

Вы действительно просто не можете этого сделать.Вызовы в реальном методе не выполняются, потому что вместо реального метода вы вызываете фиктивный метод.

Ваша первая попытка не соответствует последним двум ожиданиям, поскольку вызовы, которые могли бы их пропустить, сделаны тольков реальной реализации sendNotifications, а не в том издевательстве, которое вы из него сделали.

Второе ближе к работоспособному, но вам нужно добавить свой mockedNotification в список notificationEntries, который вынастроен на возврат по макету getByNotificationType.

...