[英]Spy with mockito a class extending ArrayBlockingQueue
您好,有人会知道如何监视扩展ArrayBlockingQueue
的 class 吗? 例如,我想监视以下MyBufferQueue
class
public class MyBufferQueue extends ArrayBlockingQueue<MyBuffer> {}
在属于 java 库的ArrayBlockingQueue
class 内部,有这个方法:
public void put(E e) throws InterruptedException {
Objects.requireNonNull(e);
final ReentrantLock lock = this.lock;
lock.lockInterruptibly();
try {
while (count == items.length)
notFull.await();
enqueue(e);
} finally {
lock.unlock();
}
}
我遇到的问题是,当我监视 class MyBufferQueue
并在测试期间访问方法ArrayBlockingQueue.put(E e)
时,我在this.lock
中得到一个NullPointerException
,而假设它不应该是null
,因为我正在测试中创建MyBufferQueue
的新实例,并且在创建新实例时, ArrayBlockingQueue
内部的字段也应该被实例化,因为ArrayBlockingQueue
是超级 class。
这是测试方法的外观:
@Test
void testMyBuffer() {
MyBufferQueue queue = spy(new MyBufferQueue(1));
doNothing().when(queue).retryAll();
queue.consumeFullQueue();
verify(queue).retryAll();
}
对于间谍活动,我使用的是 Mockito 版本 mockito-core:4.7.0,我使用的是 Java 18。
提前致谢。
我最近遇到了同样的问题,这是由 Java 17 及更高版本(可能更早,但至少在 Java 11 之后)与 Z4D1142CA810B7953E373B3833 结合使用引起的。 间谍对象的实例字段仍然是null
。
解决方案非常简单——将mockito-core
替换为mockito-inline
。 相同的 groupId,相同的版本,只是不同的 artifactId。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.