0

私は JMockit フレームワークを使用しており、型の登録EventBusを可能にする単純な実装をテストしようとしています。イベントがイベント バス上にある場合、登録されているすべてのハンドラーが通知を受け取ります。イベントは、後続のハンドラーにイベントが通知されない原因となるイベント ハンドラーによって消費される可能性があります。EventHandlersEventfired

私のテスト方法は次のようになります。

// 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が呼び出されたことを明示的に確認することはできません。これは、もはやモックされた型ではないためです。

どんな助けでも大歓迎です、ありがとう!

4

1 に答える 1

1

私は自分で問題の解決策を見つけました。修正はかなり単純で、Verificationsブロックをブロックに変換しExpectations、モックの初期化の前に配置するだけで済みましたfirstHandler

このステートメントは のnew MockUp<EventHandler<TestEvent>>()すべてのタイプをモックしEventHandler<TestEvent>、すでに定義されているインスタンス、つまり my をオーバーライドしているように私には思えますsecondHandler。私が正しいかどうか、またはそれがバグなのか機能なのかはわかりません。

誰かが正確に何が起こっているのか知っている場合は、この回答にコメントしてください。ありがとう!

于 2011-04-21T13:23:57.030 に答える