这似乎是一个关于 Easymock 的非常详细的问题,但我很难找到该库的支持站点/论坛/邮件列表。
captures()
在使用似乎无序返回捕获的参数的方法时,我遇到了一个错误。
这是我正在测试的简化版本:
public class CaptureTest extends TestCase {
// interface we will be mocking
interface Processor {
void process(String x);
}
// class that uses the interface above which will receive the mock
class Component {
private Processor processor;
private String[] s = { "one", "two", "three", "four" };
Component(Processor processor) {
this.processor = processor;
}
public void doSomething() {
for (int i = 0; i < s.length; i++) {
processor.process(s[i]);
}
}
}
public void testCapture() {
//create the mock, wire it up
Processor mockProcessor = createMock(Processor.class);
Component component = new Component(mockProcessor);
//we're going to call the process method four times
//with different arguments, and we want to capture
//the value passed to the mock so we can assert against it later
Capture<String> cap1 = new Capture<String>();
Capture<String> cap2 = new Capture<String>();
Capture<String> cap3 = new Capture<String>();
Capture<String> cap4 = new Capture<String>();
mockProcessor.process(and(isA(String.class), capture(cap1)));
mockProcessor.process(and(isA(String.class), capture(cap2)));
mockProcessor.process(and(isA(String.class), capture(cap3)));
mockProcessor.process(and(isA(String.class), capture(cap4)));
replay(mockProcessor);
component.doSomething();
//check what values were passed to the mock
assertEquals("one", cap1.getValue());
assertEquals("two", cap2.getValue());
assertEquals("three", cap3.getValue());
assertEquals("four", cap4.getValue());
verify(mockProcessor);
}
}
(请注意,这只是一个简化的测试用例 - 我知道我可以指定我期望传递给我的模拟的参数的确切值,但在我的真实案例中,参数是具有少数字段的复杂对象,我想要捕获对象,这样我就可以只针对其中几个字段进行断言,而无需在我的测试用例中重新创建整个对象)。
当我运行测试时,它在以下位置失败:
junit.framework.ComparisonFailure:预期:<[one]> 但为:<[four]>
这意味着 EasyMock 捕获的参数cap1
不是对该方法的第一次调用,而是最后一次调用(因为值为four
)。如果我反转captures()
声明,即使用cap4
第一个方法调用等,我会得到相同的结果。
这似乎可能是 EasyMock 中的一个错误 - 在不同调用中传递给同一方法的不同参数似乎没有被正确捕获。
有其他人使用capture()
EasyMock 并遇到类似问题吗?您是否知道一种简单的解决方法,或者我可以捕获传递给我的模拟方法的参数的不同方法?
更新 1:固定代码示例以显示我正在使用createMock
,而不是createStrictMock
,但两者都出现相同的错误(尽管捕获的实际值发生了变化)。