gpt4 book ai didi

java - EasyMock:andAnswer() 与 andDelegateTo()

转载 作者:行者123 更新时间:2023-11-28 21:09:13 25 4
gpt4 key购买 nike

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com