簡體   English   中英

使用 Java mockito 驗證 scheduleExecutorService 多次調用 runnable

[英]Verify scheduledExecutorService calls the runnable multiple times using Java mockito

我每分鍾調用一次服務。 我正在嘗試編寫一個單元測試來檢查調度程序是否繼續調用可運行對象,即使調用拋出異常也是如此。 已經有一個測試用例確認在可運行文件中捕獲的異常沒有冒泡。

class ServiceRunner {

@NonNull
private final Service service;

@NonNull
private final ScheduledExecutorService scheduler;

@Inject
public ServiceRunner(final Service service) {
    this(service, Executors.newSingleThreadScheduledExecutor());
}

public void run() {
    scheduler.scheduleAtFixedRate(this::runService, 0, 1, TimeUnit.MINUTES);
}

@VisibleForTesting
void runService() {
    try {
        service.run();
    } catch {
        log.info("Exception");
    }
} } 

到目前為止,我嘗試創建一個模擬調度器和一個調度器 object。 兩種方法都適用

verify(service).run();

verify(service, times(2)).run();

失敗並顯示僅調用一次的消息。

兩者都只調用一次可運行方法,然后在單元測試中終止。 我不明白為什么調度程序在測試時不工作。

請建議如何為此用例編寫測試用例。

您的測試用例完全有缺陷,因為您沒有足夠抽象。

假設您有 2000 個單元測試,但仍然有錯誤的抽象。 2000 次測試並不多,但它可以在大約 1 分鍾內運行。 現在假設 1% 的測試依賴於ServiceRunner class,即 20 個測試。 認為 20 個類使用名為ServiceRunner的 class 並非沒有道理。 好吧,現在你的測試,而不是運行大約 1 分鍾,它們運行 1 分鍾 + 20 * 1 分鍾,所以 21 分鍾。

因此,請幫自己一個忙,並為您的構造函數添加一個參數,說明您的服務必須運行的固定速率。 當你測試它時,確保它以每個固定速率運行。

這樣,你可以讓你的測試等待 2 * 1 秒(如果你寫了 1 秒),或者更好的 2 * 100 毫秒。

你的測試會變成這樣:

var unit = MILLISECONDS;
var duration = 100;

var service = mock(Service.class);
var serviceRunner = new ServiceRunner(service, duration, unit);
serviceRunner.run();
unit.sleep(2 * duration);
verify(service, times(2)).run();

另外,不要忘記關閉你的scheduler ,通常是通過包裝調用它:

class ServiceRunner {
...
public void shutdown() {
  scheduler.shutdown();
}
...
}

然后調整您的測試:

var unit = MILLISECONDS;
var duration = 100;

var service = mock(Service.class);
var serviceRunner = new ServiceRunner(service, duration, unit);
serviceRunner.run();
unit.sleep(2 * duration);
serviceRunner.shutdown();
unit.sleep(duration); // Give it more time to make sure it's called twice and not three times.
verify(service, times(2)).run(); //

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM