這個程序是對跑馬場的模仿

首先,與之前的項目一樣,從存儲庫中創建一個分支:https://github.com/CodeGymCC/hippodrome,然後自己克隆這個分支。

您的任務是添加測試和日誌記錄。

所需測試列表

在下面的列表中,每個項目都必須作為單獨的測試方法來實現。在為測試方法起名字時,盡量簡潔,但同時,這樣你就可以大致了解它們到底在測試什麼。例如,比較這兩個測試結果:

在第二種情況下,更難理解什麼樣的測試沒有通過,您將不得不查看日誌。

1.馬類:

  1. 構造器
    • 檢查當作為第一個參數傳遞給構造函數時IllegalArgumentException,將被拋出null。為此,請使用該方法assertThrows
    • 檢查當作為第一個參數傳遞給構造函數時null,拋出的異常將包含消息“Name cannot be null.”。為此,您需要從捕獲的異常中獲取消息並使用assertEquals;
    • 檢查當將空字符串或僅包含空白字符(空格、製表符等)的字符串作為第一個參數傳遞給構造函數時,. 將被拋出IllegalArgumentException。要使用不同的空白字符變體進行測試,您需要使測試參數化;
    • 檢查當將空字符串或僅包含空白字符(空格、製表符等)的字符串作為第一個參數傳遞給構造函數時,拋出的異常將包含消息“Name cannot be blank.”;
    • 檢查當一個負數作為第二個參數傳遞給構造函數時,IllegalArgumentException;
    • 檢查當一個負數作為第二個參數傳遞給構造函數時,拋出的異常將包含消息“Speed cannot be negative.”;
    • 檢查當一個負數作為第三個參數傳遞給構造函數時,IllegalArgumentException;
    • 檢查當將負數作為第三個參數傳遞給構造函數時,拋出的異常將包含消息“Distance cannot be negative.”;
  2. 獲取名稱方法
    • 檢查該方法是否返回作為第一個參數傳遞給構造函數的字符串;
  3. 獲取速度方法
    • 檢查該方法是否返回作為第二個參數傳遞給構造函數的數字;
  4. 獲取距離方法
    • 檢查該方法是否返回作為第三個參數傳遞給構造函數的數字;
    • 如果對像是使用帶有兩個參數的構造函數創建的,則檢查該方法是否返回零;
  5. 移動方法
    • 檢查該方法是否使用參數 0.2 和 0.9 在方法內部調用getRandomDouble。為此,您需要使用MockedStatic它的方法verify
    • 檢查該方法是否分配了通過以下公式計算的距離值:distance + speed * getRandomDouble(0.2, 0.9)。為此,您需要鎖定它,getRandomDouble以便它返回您需要通過參數化測試設置的某些值。

2.競技場類:

  1. 構造器
    • 檢查當傳遞給構造函數時IllegalArgumentException,將被拋出null
    • 檢查當傳遞給構造函數時null,拋出的異常將包含消息“Horses cannot be null.”;
    • 檢查將空列表傳遞給構造函數時,將拋出IllegalArgumentException;
    • 檢查將空列表傳遞給構造函數時,拋出的異常將包含消息“Horses cannot be empty.”;
  2. getHorses 方法
    • 檢查該方法返回的列表是否包含與傳遞給構造函數的列表相同的對象和相同的順序。創建Hippodrome對象時,將 30 匹不同馬的列表傳遞給構造函數;
  3. 移動方法
    • 檢查該方法是否在所有馬匹上調用了 move 方法。創建 Hippodrome 對象時,將包含 50 匹模擬馬的列表傳遞給構造函數並使用verify.
  4. 獲得贏家方法
    • 檢查該方法是否返回具有最大距離值的馬。

3.主類

  1. 主要方法
    • 檢查該方法的執行時間是否不超過 22 秒。為此,請使用超時註釋。編寫此測試後,將其禁用(使用 Disabled 註釋)。因此運行所有測試不會花費時間,如果需要,可以手動運行。

需要記錄什麼

1.主類:

  1. 創建賽馬場對像後,將如下條目添加到日誌中:2022-05-31 17:05:26,152 INFO Main: Start of the race. Number of participants: 7
  2. 顯示有​​關獲勝者的信息後,將如下條目添加到日誌中:2022-05-31 17:05:46,963 INFO Main: End of the race. Winner: Cherry

競技場類:

  1. 如果將 null 傳遞給構造函數,則在拋出異常之前,在日誌中添加如下條目:2022-05-31 17:29:30,029 ERROR Hippodrome: Horses list is null
  2. b. 如果向構造函數傳遞了一個空列表,則在拋出異常之前,向日誌中添加如下條目:2022-05-31 17:30:41,074 ERROR Hippodrome: Horses list is empty
  3. 在構造函數的末尾,將這樣的條目添加到日誌中:2022-05-31 17:05:26,152 DEBUG Hippodrome: Created a Hippodrome with [7] horses

3.馬類:

  1. 如果將 null 而不是名稱傳遞給構造函數,則在拋出異常之前,在日誌中添加一個條目,例如:2022-05-31 17:34:59,483 ERROR Horse: Name is null
  2. 如果傳遞給構造函數的名稱為空,則在拋出異常之前,在日誌中添加如下條目:2022-05-31 17:36:44,196 ERROR Horse: Name is blank
  3. 如果傳遞給構造函數的速度小於零,則在拋出異常之前,在日誌中添加如下條目:2022-05-31 17:40:27,267 ERROR Horse: Speed is negative
  4. 如果傳遞給構造函數的距離小於零,則在拋出異常之前,在日誌中添加如下條目:2022-05-31 17:41:21,938 ERROR Horse: Distance is negative
  5. 在構造函數的末尾,將這樣的條目添加到日誌中:2022-05-31 17:15:25,842 DEBUG Horse: Created a Horse named [Lobster] with speed [2.8]

日誌應寫入hippodrome.log文件,該文件應位於項目根目錄的日誌文件夾中。每天都應根據hippodrome.2021-12-31.log模式重命名該文件,並創建一個新的hippodrome.log。為此,請使用RollingFile appender 。在這種情況下,應該刪除超過 7 天的文件。為此,您可以使用如下結構:

<DefaultRolloverStrategy>
    <Delete>
        <IfFileName/>
        <IfLastModified/>
    </Delete>
</DefaultRolloverStrategy>

用谷歌搜索代替三個點的內容。😊


項目分析完成後觀看!