我在使用 EasyMock 时遇到一些奇怪的行为。我已经设置了一些期望,但是当我运行测试时,EasyMock 失败了,因为我的期望按指定执行。以下是失败的示例:
Unexpected method call MyClass.myMethod(en, EasyMock for interface com.google.common.collect.Multimap, EasyMock for interface java.util.concurrent.BlockingQueue, EasyMock for interface java.util.concurrent.BlockingQueue):
MyClass.myMethod(en, EasyMock for interface com.google.common.collect.Multimap, EasyMock for interface java.util.concurrent.BlockingQueue, EasyMock for interface java.util.concurrent.BlockingQueue): expected: 100, actual: 0
测试如下所示:
Multimap<String, String> multimap = createMock(Multimap.class);
BlockingQueue<MyType> myTypeQueue = createMock(BlockingQueue.class);
BlockingQueue<MyOtherType> myOtherTypeQueue = createMock(BlockingQueue.class);
MyClass myClass = createMock(MyClass.class);
QueueFactory queueFactory = createMock(QueueFactory.class);
expect(queueFactory.<MyType>getQueue(100)).andReturn(myTypeQueue).times(2);
expect(queueFactory.<MyOtherType>getQueue(100)).andReturn(myOtherTypeQueue).times(2);
expect(myClass.myMethod("en", multimap, myTypeQueue, myOtherTypeQueue)).andReturn(something).times(100);
replayAll();
// The actual method to test
TestClass myTestInstance = new TestClass(myClass);
myTestInstance.testMethod(queueFactory, multimap);
myTestInstance.testMethod(queueFactory, multimap);
这是我正在测试的方法:
public class MyTestClass
private MyClass myClass;
public MyTestClass(MyClass myClass) {
this.myClass = myClass;
}
public void testMethod(QueueFactory queueFactory, Multimap<String, String> multimap) {
BlockingQueue<MyType> myTypeQueue = queueFactory.getQueue(100);
BlockingQueue<MyOtherType> myOtherTypeQueue = queueFactory.getQueue(100);
for (int i = 0; i < 50; ++i) {
myClass.myMethod("en", multimap, myTypeQueue, myOtherTypeQueue);
}
}
}
到目前为止,我已经尝试用 HashMultimap 和 ArrayBlockingQueue 的实例替换模拟。我还尝试将所有方法参数包装在 EasyMock.eq
中。这些方法都没有解决问题。
有什么想法为什么会发生这种情况吗?
最佳答案
由于类型删除,EasyMock 无法确定该情况
expect(queueFactory.<MyType>getQueue(100))
不同于
expect(queueFactory.<MyOtherType>getQueue(100))
每个 expect
调用都会按顺序注册多次调用的期望。所以
expect(queueFactory.<MyType> getQueue(100)).andReturn(myTypeQueue).times(2);
声明前两次调用getQueue(100)
,它将返回myTypeQueue
。如果您遵循
expect(queueFactory.<MyOtherType> getQueue(100)).andReturn(myOtherTypeQueue).times(1);
接下来两次调用 getQueue(100)
将返回 myOtherTypeQueue
。
在您的testMethod
中,您调用
BlockingQueue<MyType> myTypeQueue = queueFactory.getQueue(100);
BlockingQueue<MyOtherType> myOtherTypeQueue = queueFactory.getQueue(100);
调用 getQueue(100)
两次,即。前两次。它们都将返回 myTypeQueue
,这打破了对 myClass.myMethod
的期望。
当您只执行一次时,它会起作用,因为第一个 expect
返回 myTypeQueue
,第二个返回 myOtherTypeQueue
,然后与您的 >myClass.myMethod
期望。
您可以通过按顺序注册每个内容一次来修复此问题
expect(queueFactory.<MyType> getQueue(100)).andReturn(myTypeQueue).times(1);
expect(queueFactory.<MyOtherType> getQueue(100)).andReturn(myOtherTypeQueue).times(1);
expect(queueFactory.<MyType> getQueue(100)).andReturn(myTypeQueue).times(1);
expect(queueFactory.<MyOtherType> getQueue(100)).andReturn(myOtherTypeQueue).times(1);
关于java - EasyMock 在预期调用时显示意外调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27637751/