Подтвердить что ты не робот

JMockit - два изделенных экземпляров того же типа

Я использую структуру 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 вызывается, потому что он больше не является издеваемым типом.

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

4b9b3361

Ответ 1

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

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

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