- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
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/
EasyMock中的andAnswer()和andDelegateTo()方法在使用上有什么区别? 一阶差分 我知道当使用 andAnswer 方法时,它会跳过构造函数调用。如果构造函数做了额外的事情
我是一名优秀的程序员,十分优秀!