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
вызывается, потому что он больше не является издеваемым типом.
Любая помощь очень ценится, спасибо!
Ответы
Ответ 1
Я сам нашел решение проблемы. Исправление было довольно простым, мне просто нужно было преобразовать блок Verifications
в блок Expectations
и поставить его перед инициализацией mocked firstHandler
.
Мне кажется, что оператор new MockUp<EventHandler<TestEvent>>()
mocks каждый тип EventHandler<TestEvent>
и переопределяет уже определенные экземпляры, т.е. my secondHandler
. Я прав или нет, или это ошибка или функция, которую я не знаю.
Если кто-то знает, что именно происходит, прокомментируйте этот ответ. Спасибо!