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