andAnswer()和andDelegateTo()方法在EasyMock中的用法有哪些不同?
第一差分
我知道当使用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的构造函数其他的区别是什么?
发布于 2016-11-16 20:24:40
这两种方法的目的是为您的测试提供不同级别的责任。不过,你的例子没那么好。
下面是一个简单的方法,它演示了这两者在功能上如何提供不同的测试期望。
public String foo() throws Exception {
throw new Exception();
}使用andAnswer,您可以使这个方法的模拟版本返回一个字符串,即使它在实践中永远不会返回一个字符串。您对andAnswer的使用意味着预期的响应。
对于andDelegateTo,这总是会引发异常。使用andDelegateTo意味着实际的响应。
andAnswer意味着特定于测试的代码将处理响应。例如,如果您为一个ParrotAnswer方法创建了一个MockDao update方法,那么鹦鹉将返回更新的对象,但是在这个过程中并没有实际实例化Dao。对于单元测试来说,这是很好的,在这里,您基本上可以遍历测试主题,但是如果模拟的方法不像您的方法实际做的那样,则不会有任何帮助。
andDelegateTo允许您提供一个实现接口的实际对象来处理响应。我们允许测试对象控制对资源的访问,而不是提供对完整资源的无限制访问。这样做的好处是,您可以测试集成到测试环境中,但将对测试环境的实际更改最小化。例如,可以将get委托给有线Dao,以便从Db中获取实际的活动值,并模拟delete方法,因此在测试期间不实际删除相同的值(例如,如果具有静态id,则必须稍后再重新创建该值以执行相同的测试)。
https://stackoverflow.com/questions/40640742
复制相似问题