JMockit - два ложных экземпляра одного типа - PullRequest
0 голосов
/ 20 апреля 2011

Я использую инфраструктуру JMockit и пытаюсь протестировать мою простую реализацию EventBus, которая позволяет регистрировать EventHandlers для типов Event. Когда событие имеет значение fired на шине событий, все зарегистрированные обработчики получают уведомление. Событие может быть использовано обработчиком события, что приведет к тому, что последующие обработчики НЕ будут уведомлены о событии.

Мой метод испытаний выглядит следующим образом:

// The parameter secondHandler should be mocked automatically by passing it
// as an argument to the test method
@Test
public void testConsumeEvent(final EventHandler<TestEvent> secondHandler)
{
    // create the event which will be fired and which the handlers are
    // listening to
    final TestEvent event = new TestEvent();

    // this handler will be called once and will consume the event
    final EventHandler<TestEvent> firstHandler = 
        new MockUp<EventHandler<TestEvent>>()
        {
            @Mock(invocations = 1)
            void handleEvent(Event e)
            {
                assertEquals(event, e);
                e.consume();
            }
    }.getMockInstance();

    // register the handlers and fire the event
    eventBus.addHandler(TestEvent.class, firstHandler);
    eventBus.addHandler(TestEvent.class, secondHandler);
    eventBus.fireEvent(event);

    new Verifications()
    {
        {
            // verify that the second handler was NOT notified because
            // the event was consumed by the first handler
            onInstance(secondHandler).handleEvent(event);
            times = 0;
        }
    };
}

Когда я пытаюсь запустить этот код, я получаю следующее исключение:

java.lang.IllegalStateException: Missing invocation to mocked type at this 
point; please make sure such invocations appear only after the declaration
of a suitable mock field or parameter

Исключение возникает в строке times = 0, и я не знаю, почему, поскольку тип secondHandler должен быть поддельным, поскольку он передается в качестве параметра в метод теста. Добавление @Mocked или @Injectable к параметру не имеет значения.

Если я сделаю стандартный класс из firstHandler, который будет просто использовать событие, а затем протестировать код, все будет работать нормально. Но в этом случае я не могу явно подтвердить, что метод firstHandler handleEvent вызывается, потому что он больше не является ложным типом.

Любая помощь очень ценится, спасибо!

1 Ответ

1 голос
/ 21 апреля 2011

Я сам нашел решение проблемы.Исправление было довольно простым, мне просто нужно было преобразовать блок Verifications в блок Expectations и поместить его ДО инициализации поддельного firstHandler.

Мне кажется, что утверждение new MockUp<EventHandler<TestEvent>>() высмеивает каждый тип EventHandler<TestEvent> и переопределяет уже определенные экземпляры, т.е. мой secondHandler.Прав ли я или нет, или это ошибка или функция, которую я не знаю.

Если кто-то знает, что именно происходит, пожалуйста, прокомментируйте этот ответ.Спасибо!

...