繁体   English   中英

使用 mockito 监视 class 扩展 ArrayBlockingQueue

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM