簡體   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