1

EasyMock(3.1)クラスのモックに問題があります。これは、部分的なクラスの実装をモックするのに適していると思われます。これは、不足しているメソッドをモックアウトしながら、抽象基本クラスを単体テストするのに理想的であると私は考えました。これがパターンです-すぐに認識できるクラシック...

public interface Interface {
    public void intfMethod();
}

public abstract class AbstractBase implements Interface {
    public void otherMethod() {
        // do some stuff we need to test...
        intfMethod();
    }
}

今テスト:

public class TestAbstractBase {
    AbstractBase testInstance;

    @Before
    public void setUp() {
        testInstance =
            createMockBuilder(AbstractBase.class).addMockedMethod("intfMethod").createMock();
    }
    @Test
    public void testOtherMethod() {
        testInstance.intfMethod();  // expect this to be invoked on the mock...
        replay(testInstance);
        testInstance.otherMethod();
        verify(testInstance);
    }
}

EasyMockはこれを好まないようです。それは投げます:

java.lang.IllegalArgumentException: Method not found (or private): intfMethod
    at org.easymock.internal.MockBuilder.addMockedMethod(MockBuilder.java:78)
    at TestAbstractBase.setUp(TestAbstractBase.java:19)

何か案は?私は関連する質問を見つけましたが、それは実際にはそのタイトルを正当化するものではありません...

4

1 に答える 1

5

@nhaldimannに感謝します; 私は、ドキュメント内のこの無害なステートメント、つまり「抽象メソッドはデフォルトで便利にモックされている」というステートメントを見落としていました。したがって、上記のすべてのニーズは、次のように、インターフェイスメソッドを明示的にモックする試みを削除することです。

testInstance = createMockBuilder(AbstractBase.class).createMock();

これを調査しているときに、他の2つの回避策に出くわしました。ただし、上記の方が明らかに望ましいです。

  1. 次のように、より強力なaddMockedMethod(Method)APIを使用します。

    public void setUp() throws Exception {
        Method m = AbstractBase.class.getMethod("intfMethod");
        testInstance = createMockBuilder(AbstractBase.class).addMockedMethod(m).createMock();
    }
    
  2. intfMethodでメソッドを明示的に公開しますAbstractBase

これらの2つの回避策は、私の最初の問題がEasyMock側のちょっとしたバグであることを示唆しています。しかし、最初にそのメソッドをモックする必要はないので、これは「ユーザー(私の)エラー」であると言います。

于 2013-01-07T18:44:19.443 に答える