0

メソッド呼び出しをテストするために Mockery をセットアップしようとすると、問題が発生します。JUnit と JMock を使用して抽象クラスの保護されたメソッドをテストする方法を見ましたが、本質的に同じ質問ですが、クリスが答えで何を参照しているのかわかりません。誰かに少し違う方法で、またはより完全な英語で説明してもらうことができれば. 次のように、JUnit、JMock2、Infinitest (問題がある場合)、および標準のイベントベースのメッセージ システムを使用しています。

public Interface MyEventListener {
    void handleMyEvent(MyEvent e);
}

public Class MyEvent extends EventObject {
    public MyEvent(Object source) {
        super(source);
    }
}

public Class MySource {
    protected List<MyEventListener> listeners = new ArrayList<MyEventListeners>();

    public void addListener(MyEventListener listener) {
        listeners.add(listener);
    }

    public void removeListener(MyEventListener listener) {
        listeners.remove(listener);
    }

    // other code...

    protected void raiseEvent() {
        for (MyEventListener listener : listeners) {
            listener.handleMyEvent(new MyEvent(this));
        }
    }
}

ここに私のテストがあります:

@Test
public void sourceShouldThrowEventOnEventOccurrence() {
    // set up
    Mockery context = new Mockery();
    MyEventListener listener = context.mock(MyEventListener.class);
    MySource source = new MySource();
    MyEvent event = new MyEvent(source);
    source.addListener(listener);

    // set expectations
    context.checking(new Expectations() {{
        oneOf(listener).handleMyEvent(event);
    }});

    // execute
    // do stuff to (theoretically) raise event

    // verify
    context.assertIsSatisfied();
}

MySource の raiseEvent() の保護されたメソッドで ExpectationError (予期しない呼び出し) が発生します。保護されたメソッドを呼び出す必要があるという期待にどのように追加できますか?

また、考えが浮かびました - しかし、私はそれを探求する前にこのメッセージをまだ投稿しています(他の誰かが同じ質問をしていて、私の考えが正しいかどうかで終わる場合に備えて). このエラーは、コードに 2 つの新しいキーワードがあることに関連している可能性がありますか? MySource.raiseEvent() に new MyEvent(this) があり、テストに new MyEvent(source) があります。これにより、メモリ内に 2 つの異なるイベントが作成されます...メソッドが 1 つのイベントを取得することを期待しているが、もう 1 つのイベントを受け取る可能性に関連するエラーですか?

*****編集

実際、具体的には、実際にイベントを発生させるコード行で ExpectationError (予期しない呼び出し) が発生します。(上記のコードでは、listener.handleMyEvent(new MyEvent(this));行)

4

1 に答える 1

0

2 つの異なる MyEvent インスタンスが作成されたという事実に関連しているという私の疑いは正しかったことが判明しました。残念ながら、それは私の質問のタイトルが誤解を招くものであることを意味します. 掘り下げた後、Expectations()を次のように変更すると、コードが正常に機能することがわかりました。

@Test
public void sourceShouldThrowEventOnEventOccurrence() {
    // set up
    Mockery context = new Mockery();
    MyEventListener listener = context.mock(MyEventListener.class);
    MySource source = new MySource();
    // MyEvent event = new MyEvent(source);  <-- NO LONGER NEEDED
    source.addListener(listener);

    // set expectations
    context.checking(new Expectations() {{
        oneOf(listener).handleMyEvent(with(any(MyEvent.class)));  // <-- with any
    }});

    // execute
    // do stuff to (theoretically) raise event

    // verify
    context.assertIsSatisfied();
}
于 2012-05-09T16:06:53.270 に答える