java - EasyMock:andAnswer() 与 andDelegateTo()

标签 java unit-testing testing mocking easymock

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,您可以使此方法的模拟版本返回一个字符串,即使它在实践中永远不会返回一个字符串。您使用 andAnswer 表示预期的响应。

使用andDelegateTo,这将始终抛出异常。您对 andDelegateTo 的使用意味着实际响应。

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

andDelegateTo 允许您提供实现接口(interface)的实际对象来处理响应。我们允许我们的测试对象控制访问资源,而不是提供对完整资源的无限制访问。这样做的好处是您可以测试集成到测试环境中,但尽量减少对测试环境的实际更改。例如,您可以将 get 委托(delegate)给有线 Dao 以从 Db 中获取实际的 Activity 值,并模拟 delete 方法,因此您实际上并没有删除相同的内容测试期间的值(例如,如果它具有静态 ID,则稍后必须再次重新创建它以进行相同的测试)。

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

相关文章:

java - 无法测试libgdx项目

django - 检测 CI 中 Django 翻译 (PO) 文件的更改

ruby-on-rails - 太阳黑子的奇怪问题。

visual-studio-2010 - 错误的网关错误 - fiddler 负载测试/visual studio 2010

java - 将部分数独文本文件加载到二维数组中

java - websockets 和 java servlet

java - Bitronix + Spring + Hibernate + Mysql 启动时卡住

ios - 如何检索 cellForRow(位于 :) when tableview isn't visible

java - Hibernate 无法确定方言

unit-testing - 改进此代码的方法