这似乎是关于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 Capturecap1 = new Capture (); Capture cap2 = new Capture (); Capture cap3 = new Capture (); Capture cap4 = new Capture (); 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); } }
(请注意,这只是一个简化的测试用例 - 我知道我可以指定我希望传递给我的mock的参数的确切值,但在我的实际情况中,参数是带有少量字段的复杂对象,我想要捕获对象,这样我就可以在没有在我的测试用例中重新创建整个对象的情况下断言这几个字段.
当我运行测试时,它失败了:
junit.framework.ComparisonFailure:expected:<[one]>但是:<[four]>
这意味着EasyMock捕获的参数cap1
不是对方法的第一次调用,而是最后一次调用(因为值是four
).如果我反转captures()
声明,即使用cap4
第一个方法调用等,我得到相同的结果.
这似乎可能是EasyMock中的一个错误 - 在不同的调用中传递给同一方法的不同参数似乎没有被正确捕获.
是否有其他人使用capture()
EasyMock并遇到类似问题?有没有你知道的简单解决方法,或者我可以采用不同的方式捕获传递给我的mock方法的参数?
更新1:固定代码示例显示我正在使用createMock
,不是createStrictMock
,但我得到两个相同的错误(虽然捕获的实际值发生了变化).