2

以下のテストの動作がよくわかりません。それを見ると、test_OKtest_Not_OKは厳密に同等です。唯一の違いは、test_OK「インライン化」されていることcallMethodです。

ただし、失敗test_OKする一方で合格test_Not_OKします。その行動には理由がありますか?

public class MethodCallTest {
    @Test
    public void test_Not_OK() {
        new NonStrictExpectations() {
            Whatever w;
            {
                callMethod();
            }
            private void callMethod() {
                w.method();
                result = 1;
            }
        };
        assertEquals(new Whatever().method(), 1); //fails
    }

    @Test
    public void test_OK() {
        new NonStrictExpectations() {
            Whatever w;
            {
                w.method();
                result = 1;
            }
        };
        assertEquals(new Whatever().method(), 1); //passes
    }

    public static class Whatever {
        public int method() {
            return 0;
        }
    }
}
4

1 に答える 1

2

良い質問。その理由は、JMockit が、ExpectationsまたはNonStrictExpectationsサブクラスのコンストラクターおよび初期化ブロックでバイトコードに特定の変換を実行するためです。(基本的に、これはモック API が機能するように行われます。たとえば、特別なresultフィールドへのすべての割り当ては、実際にはメソッド呼び出しに置き換えられるため、現在の期待に適切に関連付けられます。)

ただし、expectation ブロック内のメソッドはまだ変換されていません。そうあるべきなので、今それを実装しています。次のリリース (0.999.19) から、これはサポートされます。

于 2012-11-05T11:27:07.917 に答える