有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java EasyMock:andAnswer()与andDelegateTo()的比较

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的构造函数

其他的区别是什么


共 (1) 个答案

  1. # 1 楼答案

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

    下面是一个简单的方法,演示这两种方法在功能上如何提供不同的测试预期

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

    使用andAnswer,您可以让这个方法的模拟版本返回一个字符串,即使它实际上永远不会返回一个字符串。使用andAnswer意味着预期的响应

    对于andDelegateTo,这将始终引发异常。你对andDelegateTo的使用意味着实际的反应

    andAnswer表示特定于测试的代码将处理响应。例如,如果为MockDao update方法创建ParrotAnswer,Parrot将返回更新的对象,但在该过程中没有实际实例化Dao。这对于单元测试来说很好,在单元测试中,你基本上是在测试主题中穿行,但是如果你的模拟方法没有像你的方法实际做的那样,那就没有帮助了

    andDelegateTo允许您提供实现接口的实际对象来处理响应。我们允许受试者控制地访问资源,而不是提供对完整资源的无限制访问。这样做的好处是,您可以将集成测试到测试环境中,但要尽量减少对测试环境的实际更改。例如,您可以将get委托给一个有线Dao,从Db中获取一个实际的活动值,并模拟delete方法,这样您就不会在测试期间实际删除同一个值(例如,如果它有一个静态id,那么以后必须重新创建它来执行相同的测试)