場合によっては、クラス メソッドをテストしたい場合や、スーパー クラス メソッドの呼び出しを期待したい場合があります。easymock または jmock を使用して Java でこの期待を行う方法を見つけられませんでした (それは不可能だと思います)。
スーパークラスメソッドロジックでデリゲートを作成し、それに期待を設定する(比較的)クリーンなソリューションがありますが、そのソリューションをいつ使用するのか、理由はわかりません。アイデア/例はありますか?
ありがとう
まあ、あなたがしたい場合はできます。あなたが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
を呼び出していることを検証できます。Bar
Foo
@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();
}
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 クラスに置き換えられます。
スーパーコールを嘲笑するつもりはないと思います-依存関係の動作ではなく、クラス自体の動作の一部であるように感じます。モッキングは常に、何よりも依存関係に関係しているように感じます。
モックアウトしたい種類の呼び出しの良い例はありますか? このような呼び出しをモックしたい場合、継承ではなく構成を検討する価値はありますか?
Animated Transitions サンプル テスト スイートには、JMockit Expectations API を使用してそれを行う (つまり、スーパークラス メソッドで予期される呼び出しを指定する) いくつかのテストがあります。たとえば、FadeInTestテスト ケースです。
いいえ、jMockでスーパークラスのメソッドをモックする方法はありません。
ただし、問題に対する迅速かつ汚い解決策があります。クラス A があり、クラス B が A を拡張するとします。B でメソッド Aa() をモックしたいとします。テスト コードにクラス C extends B を導入し、メソッド Ca() をオーバーライドできます (super を呼び出すか、null を返すか、id を返すだけです)。重要ではない)。その後、C をモックし、B を使用するあらゆる場所でモックを使用します。
スーパー コールをインターセプトするのは、きめが細かすぎます。孤立をやり過ぎないでください。