簡體   English   中英

測試用例中的 Java Arguments.of():它是如何工作的?

[英]Java Arguments.of() in a test case: How does it work?

我得到了參數化的測試用例,並使用我不熟悉的 Stream.of 和 Arguments.of。 如下所示,測試用例引用了我的 class BofAAdapter 的構造函數並傳遞了 BofA object。我想知道如何在我的 class 中訪問 integer (500) 和 map 條目,或者它們被傳遞到哪里。 我不能編輯測試用例,所以我不能簡單地讓它們用不同的構造函數進行測試。 我對這個測試所做的很迷茫。

@ParameterizedTest
    @MethodSource("providerBankAccountsGetDelinquent")
    public void testBankAccountsGetDelinquent(IBankAccounts adapter, int threshold, Map<Integer, Integer> expected) {
        Map<Integer, Integer> actual = adapter.getDelinquent( threshold );
        assertEqualMaps( expected, actual );
    }
    static Stream<Arguments> providerBankAccountsGetDelinquent() {
        return Stream.of(
                Arguments.of( new BofAAdapter( new BofA() ), 500, 
                        Map.ofEntries(
                            Map.entry( 1, 500),
                            Map.entry( 5,  20)
                        )),

Argumentsjunit 5的概念。

您可以在上面鏈接的 junit 網站上了解 Arguments 的內容和使用方法,以及這里發生的事情。

給你一個快速概覽:通常,測試方法沒有 arguments。測試框架 (junit5) 將看到@Test注釋並運行它。

但這是一個不同的野獸:這個測試方法有..參數:試一下測試框架? 你將如何調用它? 您將什么傳遞給“適配器”和“閾值”?

這就是@MethodSource注釋的含義:它告訴 junit:首先,運行providerBankAccountsGetDelinquent方法,junit 可以執行該方法,因為沒有 arguments 要傳遞。 然后獲取此方法為您提供的 arguments,它是一個 stream(因此, Arguments類的任意數量的實例),並針對每個 Arguments object 運行此測試方法一次。

所以,這最終發生了:

  1. junit 調用 providerBankAccountsGetDelinquent
  2. junit 得到一個Stream<Arguments> object。
  3. junit 將開始迭代 stream。
  4. stream 將返回它永遠返回的第一個(也是唯一一個)object:閾值為 500 的 Arguments object,一個新的 BofAAdapter 等。
  5. 然后它將使用那些 arguments 調用testBankAccountsGetDelinquent並根據該測試的結果打印“成功”或“失敗”(這將取決於這些映射是否相等)
  6. junit 向 stream 詢問下一個 object。
  7. stream 說:不,我全力以赴,那個 Arguments object 是我所有的。
  8. 這部分測試序列現已完成。

換句話說,所有這些代碼都是一種復雜而愚蠢的編寫方式:

@Test
public void testBankAccountsGetDelinquent() {
    IBankAccounts adapter = new BofAAdapter( new BofA() );
    int threshold = 500;
    Map<Integer, Integer> expected = Map.ofEntries(
                            Map.entry( 1, 500),
                            Map.entry( 5,  20)
                        );
    Map<Integer, Integer> actual = adapter.getDelinquent( threshold );
    assertEqualMaps(expected, actual);
}

當然,大概這段代碼是向您展示@ParameterizedTest工作原理的示例,或者有人計划擴展providerBankAccountsGetDelinquent

請注意,一般的想法是您使用此@ParameterizedTest機制來創建動態輸入。 想象一下,例如,您想要對從 400 到 500 的所有閾值運行此測試,並且 map 也發生變化。 那么這是做到這一點的一種方法。

暫無
暫無

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

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