就用法而言,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/