Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java EasyMock-模仿从接口继承的抽象方法_Java_Unit Testing_Easymock - Fatal编程技术网

Java EasyMock-模仿从接口继承的抽象方法

Java EasyMock-模仿从接口继承的抽象方法,java,unit-testing,easymock,Java,Unit Testing,Easymock,我在EasyMock(3.1)的课堂模拟中遇到了一些困难。这应该适合于模拟部分类实现,我认为,这应该是在模拟缺少的方法时对抽象基类进行单元测试的理想选择。这里的模式-一个立即识别的经典 public interface Interface { public void intfMethod(); } public abstract class AbstractBase implements Interface { public void otherMethod() {

我在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)

有什么想法吗?我找到了一本书,但这本书的标题并不公正……

多亏了@nhaldimann;我忽略了这一点,即“默认情况下,抽象方法很容易被模仿”。因此,上述所有需要的是消除显式模拟接口方法的尝试,如中所示:

testInstance = createMockBuilder(AbstractBase.class).createMock();
在研究这一点时,我遇到了另外两种解决方法——尽管上述方法显然更可取:

  • 使用更强的
    addMockedMethod(方法)
    API,如中所示:

    public void setUp() throws Exception {
        Method m = AbstractBase.class.getMethod("intfMethod");
        testInstance = createMockBuilder(AbstractBase.class).addMockedMethod(m).createMock();
    }
    
  • AbstractBase


  • 这两种变通方法表明,我最初的问题是在简单方面有点缺陷。但是,由于没有必要在第一个实例中模拟该方法,我们将说这是“用户(我的)错误”。

    多亏了@nhaldimann;我忽略了这一点,即“默认情况下,抽象方法很容易被模仿”。因此,上述所有需要的是消除显式模拟接口方法的尝试,如中所示:

    testInstance = createMockBuilder(AbstractBase.class).createMock();
    
    在研究这一点时,我遇到了另外两种解决方法——尽管上述方法显然更可取:

  • 使用更强的
    addMockedMethod(方法)
    API,如中所示:

    public void setUp() throws Exception {
        Method m = AbstractBase.class.getMethod("intfMethod");
        testInstance = createMockBuilder(AbstractBase.class).addMockedMethod(m).createMock();
    }
    
  • AbstractBase


  • 这两种变通方法表明,我最初的问题是在简单方面有点缺陷。但是,由于在第一个实例中不需要模拟该方法,我们将说这是“用户(我的)错误”。

    如果删除
    addMockedMethod
    调用,会发生什么?关于部分模拟的文档说“默认情况下,抽象方法可以方便地模拟”;是的,这确实有效-请参阅下面的答案。如果您只删除
    addMockedMethod
    调用,会发生什么?关于部分模拟的文档说“默认情况下,抽象方法可以方便地模拟”;是的,这确实有效-请参阅下面的答案。