私は 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
、型をモックする必要があるため、その理由はわかりません。パラメータにorをsecondHandler
追加しても違いはありません。@Mocked
@Injectable
firstHandler
イベントを消費するだけの標準クラスを から作成し、コードをテストすると、すべてが正常に実行されます。しかし、その場合、firstHandler
のメソッドhandleEvent
が呼び出されたことを明示的に確認することはできません。これは、もはやモックされた型ではないためです。
どんな助けでも大歓迎です、ありがとう!