java - EasyMock 在预期调用时显示意外调用

标签 java easymock

我在使用 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/

相关文章:

java - 奇怪的注释错误

java - 检查 EasyMock 模拟是否处于重播模式/状态

PowerMock 和 EasyMock 上的 java.lang.IllegalArgumentException : Not a mock: java. lang.Class

scala - easymock scalatest 中 Expecting 函数中的任何参数

java - EasyMock.expect(...).times(...) 与多次使用 EasyMock.expect(...) 之间的区别?

java - EasyMock - 模拟具有其他类对象和 .class 作为参数的类

java - OpenAI ChatGPT (GPT-3.5) API 错误 400 : "Unexpected response code 400 for https://api.openai.com/v1/completions" (migrating GPT-3 to GPT-3. 5 API)

java - 如何解决ThreeTenABP中的ExceptionInInitializerError和ZoneRulesException?

java - 样本有向图和拓扑排序代码

java - 野蝇 JMS : MDB beans idle when messages exist