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 楼答案
这两种方法的目的是为您的测试提供不同级别的责任。不过,你的例子不是很好
下面是一个简单的方法,演示这两种方法在功能上如何提供不同的测试预期
使用
andAnswer
,您可以让这个方法的模拟版本返回一个字符串,即使它实际上永远不会返回一个字符串。使用andAnswer
意味着预期的响应对于
andDelegateTo
,这将始终引发异常。你对andDelegateTo
的使用意味着实际的反应andAnswer
表示特定于测试的代码将处理响应。例如,如果为MockDaoupdate
方法创建ParrotAnswer,Parrot将返回更新的对象,但在该过程中没有实际实例化Dao。这对于单元测试来说很好,在单元测试中,你基本上是在测试主题中穿行,但是如果你的模拟方法没有像你的方法实际做的那样,那就没有帮助了andDelegateTo
允许您提供实现接口的实际对象来处理响应。我们允许受试者控制地访问资源,而不是提供对完整资源的无限制访问。这样做的好处是,您可以将集成测试到测试环境中,但要尽量减少对测试环境的实际更改。例如,您可以将get
委托给一个有线Dao,从Db中获取一个实际的活动值,并模拟delete
方法,这样您就不会在测试期间实际删除同一个值(例如,如果它有一个静态id,那么以后必须重新创建它来执行相同的测试)