17

場合によっては、クラス メソッドをテストしたい場合や、スーパー クラス メソッドの呼び出しを期待したい場合があります。easymock または jmock を使用して Java でこの期待を行う方法を見つけられませんでした (それは不可能だと思います)。

スーパークラスメソッドロジックでデリゲートを作成し、それに期待を設定する(比較的)クリーンなソリューションがありますが、そのソリューションをいつ使用するのか、理由はわかりません。アイデア/例はありますか?

ありがとう

4

6 に答える 6

13

まあ、あなたがしたい場合はできます。あなたがJMockitに精通しているかどうかはわかりませんが、チェックしてみてください。現在のバージョンは 0.999.17 です。

次のクラス階層を想定します。

public class Bar {
    public void bar() {
        System.out.println("Bar#bar()");
    }
}

public class Foo extends Bar {
    public void bar() {
        super.bar();
        System.out.println("Foo#bar()");
    }
}

次に、JMockit を使用して、実際にfromFooTest.javaを呼び出していることを検証できます。BarFoo

@MockClass(realClass = Bar.class)
public static class MockBar {
    private boolean barCalled = false;

    @Mock
    public void bar() {
        this.barCalled = true;
        System.out.println("mocked bar");
    }
}

@Test
public void barShouldCallSuperBar() {
    MockBar mockBar = new MockBar();
    Mockit.setUpMock(Bar.class, mockBar);

    Foo foo = new Foo();
    foo.bar();

    Assert.assertTrue(mockBar.barCalled);

    Mockit.tearDownMocks();
}
于 2009-03-08T04:49:50.663 に答える
8

JMockit 1.22 を使用して、@Cem Catikkas の回答を拡張します。

@Test
public void barShouldCallSuperBar() {
    new MockUp<Bar>() {
        @Mock
        public void bar() {
            barCalled = true;
            System.out.println("mocked bar");
        }
    };

    Foo foo = new Foo();
    foo.bar();

    Assert.assertTrue(mockBar.barCalled);
}

@MockClass でアノテーションが付けられた静的クラスは必要ありません。MockUp クラスに置き換えられます。

于 2016-03-28T15:57:30.753 に答える
5

スーパーコールを嘲笑するつもりはないと思います-依存関係の動作ではなく、クラス自体の動作の一部であるように感じます。モッキングは常に、何よりも依存関係に関係しているように感じます。

モックアウトしたい種類の呼び出しの良い例はありますか? このような呼び出しをモックしたい場合、継承ではなく構成を検討する価値はありますか?

于 2009-03-08T00:23:31.800 に答える
1

Animated Transitions サンプル テスト スイートには、JMockit Expectations API を使用してそれを行う (つまり、スーパークラス メソッドで予期される呼び出しを指定する) いくつかのテストがあります。たとえば、FadeInTestテスト ケースです。

于 2009-06-21T22:39:30.787 に答える
0

いいえ、jMockでスーパークラスのメソッドをモックする方法はありません。

ただし、問題に対する迅速かつ汚い解決策があります。クラス A があり、クラス B が A を拡張するとします。B でメソッド Aa() をモックしたいとします。テスト コードにクラス C extends B を導入し、メソッド Ca() をオーバーライドできます (super を呼び出すか、null を返すか、id を返すだけです)。重要ではない)。その後、C をモックし、B を使用するあらゆる場所でモックを使用します。

于 2012-03-05T16:39:25.400 に答える
-1

スーパー コールをインターセプトするのは、きめが細かすぎます。孤立をやり過ぎないでください。

于 2009-05-21T12:24:44.177 に答える