簡體   English   中英

如何使用單元測試測試無效?

[英]How to test void using Unit Test?

我有以下方法,並為此方法用 Java 編寫了一個單元測試 除了if語句之外,它被覆蓋,我還需要測試這部分。

@InjectMocks
private ProductServiceImpl productService;

public void demoMethod(final List<UUID> productUuidList) {
    if (productUuidList.isEmpty()) {
        return;
    }
    final Map<ProductRequest, PriceOverride> requestMap = getPriceRequests(uuidList);
    productService.updateByPriceList(priceRequestMap, companyUuid);
}

但是,由於方法執行已完成並且在uuidList為空時不返回任何內容,因此我無法測試此if塊。

所以:

  1. if阻止,我該如何測試?

  2. 我應該創建一個新的單元測試方法來測試這個if塊嗎? 或者我應該將相關的斷言行添加到當前的測試方法中嗎?

更新:這是我的測試方法:

@Test
public void testDemoMethod() {
    final UUID uuid = UUID.randomUUID();
    final List<Price> priceList = new ArrayList<>();
    final Price price = new Price();
    
    price.setUuid(uuid);
    priceList.add(price);

    productService.demoMethod(Collections.singletonList(uuid));
}

一般的想法是你不想測試特定的代碼,但你想測試一些行為

因此,在您的情況下,您希望驗證在傳入空List時不會調用getPriceRequestspriceService.updateByPriceList

具體如何執行取決於您可用的工具。 最簡單的方法是,如果您已經模擬priceService :那么只需指示您的模擬庫/框架驗證從未調用updateByPriceList

在 if 條件中返回的要點是不執行其余代碼。 即,如果要執行此// code omitted for brevity ,則該方法將無法滿足其目的。 因此,只要確保無論該代碼做什么,如果您的列表為空,它就沒有完成。

你有3個選擇:

  1. 使用模擬編寫單元測試。 Mockito 允許您 verify() 是否調用了某個方法。
  2. 使用數據庫編寫更高級的測試。 在測試 Service Facade Layer 時,這通常是一個更明智的選擇。 在這種情況下,您可以在測試中獲取 DB 的結果狀態,以檢查它是否做了它必須做的。
  3. 重構您的代碼以使其工作方式不同

查看測試金字塔貧血架構如何破壞您的測試以獲取更多詳細信息。

暫無
暫無

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

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