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;我在 doc 中忽略了这个无害的声明,即“默认情况下可以方便地模拟抽象方法”。因此,上述所有需要是删除显式模拟接口方法的尝试,如:

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

在研究这一点时,我遇到了另外两种解决方法——尽管上述方法显然更可取:

  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

这两个解决方法表明我最初的问题是 EasyMock 方面的一个错误。但是由于不需要在第一个实例中模拟该方法,我们会说这是“用户(我的)错误”。

于 2013-01-07T18:44:19.443 回答