簡體   English   中英

如何使用assertEquals編寫Junit測試,以查看將使用多少硬幣退還給我?

[英]How can I write a Junit test using assertEquals to see how many of each coins will be returned to me using?

我需要使用assertEquals編寫一個測試,以查看在給錢后將退還給我的每個硬幣有多少,並且不確定如何構造它或包含哪些信息。 可以插入$ 1,$ 2,$ 5和$ 10的金額。 返回的零錢必須使用最少的硬幣。

import java.math.BigDecimal;

public class MakeChange {

BigDecimal numOfQuarters = new BigDecimal(0.00);
BigDecimal numOfDimes    = new BigDecimal(0.00);
BigDecimal numOfNickels  = new BigDecimal(0.00);

BigDecimal quarter = new BigDecimal(0.25);
BigDecimal dime    = new BigDecimal(0.10);
BigDecimal nickel  = new BigDecimal(0.05);

public MakeChange() {
}

public String changeAmount(BigDecimal amtToReturn) {
    while (amtToReturn.compareTo(quarter) >= 0) {
        numOfQuarters = amtToReturn.divideToIntegralValue(quarter);
        amtToReturn = amtToReturn.subtract(numOfQuarters.multiply(quarter));
    }
    while (amtToReturn.compareTo(dime) >= 0) {
        numOfDimes = amtToReturn.divideToIntegralValue(dime);
        amtToReturn = amtToReturn.subtract(numOfDimes.multiply(dime));
    }
    while (amtToReturn.compareTo(nickel) >= 0) {
        numOfNickels = amtToReturn.divideToIntegralValue(nickel);
        amtToReturn = amtToReturn.subtract(numOfNickels.multiply(nickel));
    }
    return "You will receive: " + numOfQuarters + " Quarters " + numOfDimes + " Dimes and " + numOfNickels
            + " Nickels.";
}
}

簡單地說:您必須編寫可測試的代碼才能測試代碼。

當然,您可以從此方法返回的字符串中解析該信息。 但這將是錯誤的方法。

事實是:您的代碼在這里混合了兩個職責:A)計算退還硬幣的方式/方式B)將其轉化為人類可讀的消息。

換句話說:您首先編寫了另一種方法,該方法返回可以由計算機輕松測試的內容。 例如,通過創建一個代表變化的類,例如:

public class Change {
  public int getNumberOfQuaterts() { ...
  public int getNumberOfDimes() { ...
  ...

現在,您可以將方法更改為:

public Change changeAmount(BigDecimal amtToReturn) { ...

現在測試變得非常容易:

Change change = new MakeChange().changeAmount(...
assertThat(change.getNumberOfQuarters, is(5));

除此之外:

  • 現在,您可以在該Change類中@Override toString() -創建該可讀的消息。 您還可以編寫簡單的測試用例,然后在其中實際檢查一些預定義的Change是否產生了一些您希望代表該對象的確切字符串。
  • 您的示例代碼中存在各種問題。 例如:擁有空的默認構造函數毫無意義。 如果構造函數無關,請不要將其寫下來。 而且, 非常重要 :你應該使用在BigDecimal的,需要一個參數的構造。 請改用BigDecimal("0.01") (請參閱此處 )。 @deprecated構造器是有原因的

最后:您還可以在Change類中使用@Override equals() ,然后將測試代碼簡化為:

assertThat(underTest.changeAmount(whatever), is(new Change(....))

您可以使自己能夠手動創建允許進行相等性檢查的更改對象,以便可以使用assertThat()直接比較更改對象。

暫無
暫無

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

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