gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 05:07:33 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com