0

JUnit/JMock で特定のバグが発生しています。いくつかのオブジェクトをモックして、すべての期待が満たされていると主張しようとしています。次のような簡単なテストを実行しています。

@Test
public void sellingPutOptionProductDoesNotCauseDisclosure() throws PositionVerificationException, DataLoadException, MissingPriceException {
    final OptionProduct optionProduct = setupOptionProduct();
    context.assertIsSatisfied();
}

private OptionProduct setupOptionProduct() {
    final Option optionProduct = context.mock(Option.class);
    context.checking(new Expectations() {
        {
            oneOf(optionProduct).getUnderlyingProduct();
            will(returnValue(new Object()));
        }
    });
    return optionProduct;
}

Option はオブジェクトであり、私は Mockery を次のように使用しています。

context = new Mockery() {
    {
        setImposteriser(ClassImposteriser.INSTANCE);
    }
};

上記のテストを実行すると、JVM が終了せず、コンソールでの最後の出力が次のようになるテストに合格しました。

スレッド「メイン」での例外

これを引き起こしている可能性のあるアイデアはありますか?

4

1 に答える 1

0

パーティーに少し遅れましたが、同様の問題が発生し、原因を突き止めることができました。
通常、期待の一部ではないメソッドが呼び出されると、JMock はログを作成して、何が期待されていたが見つからなかったかを示します。私の場合、予期しない呼び出しに遭遇した後、そのログ メッセージを作成しようとしました。ログ メッセージを作成する操作で例外がスローされ、JMock がすべて混乱し、実際には失敗していたテストが成功したと報告されました。

私の場合、例外がスローされた理由は、「予期しない」関数呼び出しに渡されるパラメーターの 1 つがクラスのインスタンスであったためです。そのクラスは、部分的にモック化されたオブジェクトで初期化されました。JMock が予期しない呼び出しについて通知するエラー メッセージを作成しようとしたとき、パラメータを記述する必要がありました。通常、それは次のようなことを言いますunexpected invocation: myobject.myMethod(param1,param2).

私の場合、param1 にはモック オブジェクトであるメンバ変数が含まれており、param1 クラスは toString() を定義していないため、デフォルトの Object.toString() が使用されました。

Object.toString() は次のように定義されます。return getClass().getName() + "@" + Integer.toHexString(hashCode());

私のハッシュコードの実装はparam1、それらのモックされたオブジェクトのいくつかを使用していました。ハッシュコードを計算するためのモック化されたオブジェクトに対するこれらの呼び出しは、それ自体が「予期しない」呼び出しであり、テストの失敗を私に説明しようとすると、JMock が例外をスローするようになりました。

残念なことに、JMock はこの状態を認識して可能な限り多くの失敗を報告する代わりに、完全にあきらめてテストを合格として報告し、率直に言及したようです。Exception in thread "main."

これが発生しているかどうかを確認するには、問題のある関数呼び出しに関連するパラメーターを確認することをお勧めします。それらのいずれかがインターフェイスではなくクラスである場合、equals / hashcode / toString の使用が、シナリオがどのように嘲笑されているかでうまくいかない可能性のあるメンバー変数への疑わしい呼び出しを使用しているかどうかを確認する必要があります。

于 2013-05-30T21:46:24.500 に答える