【发布时间】:2014-12-24 13:34:47
【问题描述】:
我在使用 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 中。这两种方法都没有解决这个问题。
任何想法为什么会发生这种情况?
【问题讨论】:
-
你在哪里调用方法?
-
MyClass.myMethod的调用发生在我正在测试的方法中。我正在测试的方法是在replayAll()之后调用的 -
让我们看看它并发布完整的堆栈跟踪。
-
这是完整的堆栈跟踪。我更新了测试以显示更多内容。
-
您的测试报告
myClass.myMethod未被调用。所以告诉我们它是。