就用法而言,EasyMock中的andAnswer()andDelegateTo()方法之间有哪些区别?

第一个区别

我知道使用andAnswer方法时,将跳过构造函数调用。如果构造函数需要做其他事情,这一点很重要。

class Dummy {
    public Dummy(Object someArgument) {
        // some validations of arguments
        System.out.println("the constructor is called");
    }
    public Object method() {
        System.out.println("the method is called");
        return new Object();
    }
}


@Test
public void testSt1() {
    Dummy mock = EasyMock.createMock(Dummy.class);
    EasyMock.expect(mock.method()).andAnswer(new IAnswer<Object>() {
        @Override
        public Object answer() throws Throwable {
            System.out.println("mocked method is called");
            return new Object();
        }
    } );

    EasyMock.replay(mock);
    mock.method();
}

@Test
public void testSt2() {
    Dummy mock = EasyMock.createMock(Dummy.class);
    EasyMock.expect(mock.method()).andDelegateTo(new Dummy(new Dummy(new Object()) {
        @Override
        public Object method() {
            System.out.println("mocked method is called");
            return new Object();
        }
    } );

    EasyMock.replay(mock);
    mock.method();
}


结果:


testSt1()不调用Dummy的构造函数
testSt2()调用Dummy的构造函数


其他区别是什么?

最佳答案

这两种方法的目的是为您的测试提供不同级别的责任。但是,您的示例并不是很好。

这是一个简单的方法,演示了这两种功能如何提供不同的测试期望。

public String foo() throws Exception {
    throw new Exception();
}


使用andAnswer,您可以使该方法的模拟版本返回String,即使实际上它永远不会返回String。您使用andAnswer表示预期的响应。

使用andDelegateTo,将始终抛出异常。您使用andDelegateTo表示实际响应。

andAnswer表示您的测试专用代码将处理响应。例如,如果您为MockDao update方法创建ParrotAnswer,则Parrot将返回更新的Object,但是在此过程中实际上没有实例化Dao。这对于单元测试非常有用,在单元测试中,您基本上会遍历测试对象,但是如果您模拟的方法没有像您实际执行的那样,则无济于事。

andDelegateTo允许您提供实现接口以处理响应的实际Object。我们允许测试对象控制对资源的访问,而不是提供对完整资源的无限制访问。这样做的好处是,您可以测试集成到测试环境中,但是将对测试环境的实际更改最小化。例如,您可以将get委派给有线Dao以从Db中获取实际的实时值,并模拟delete方法,因此您实际上不必在测试过程中删除相同的值(并且必须再次重新创建它)例如,稍后再执行相同的测试(如果它具有静态ID)。

关于java - EasyMock:andAnswer()与andDelegateTo(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40640742/

10-09 02:04