[英]Unit Testing toStrings in JAVA
您如何在JAVA中測試toString? 我想這與常規測試的概念相同,但是我確實有很多問題。 我的Big JAVA教科書中找不到任何此類信息。 我已經閱讀了至少5次,而沒有讀過的所有章節。 我只是沒有看到它,而這在任何作業中都沒有涉及。
對於一個例子,我不理解在第一個示例中在單元測試中的何處提供了代碼,我的老師在assertTrue(text.contains(num))中放入了“ num”;
我發現她放了num,因為我們遵循的是“終身政策”的格式。 防爆。
WholeLifePolicy policy = new WholeLifePolicy(num, value, years, name);
我以為,由於這是一個示例,因此我將執行相同的操作,例如如下所示的面值。
assertTrue(text.contains("Face Value:"));
assertTrue(text.contains(value));
這不會編譯,因為它表示不兼容,因為該數字是雙精度數。 所以我嘗試了兩次。 唯一可以編譯的是“ num”
因此,顯然我的測試都沒有通過。 這是我的代碼。 對於WholeLifePolicy類,請緊隨測試類。
為什么使用“ num”? 是否因為它是策略對象的顯式參數? 還是僅僅是因為里面有一個數字”還是另一個原因?
顯然我所有的代碼都在// comments下面。 實驗室源中提供了所有其他內容。
/**
* Return a string representation of the WholeLifePolicy.
*
* @return String output string.
*
* <pre>
* Produce output in the following format:
*
* Policy Information:
* Policy #: WLP1000000
* Policy Years: 20
* Face Value: 50000.0
* Beneficiary: John Doe
*
* </pre>
*/
public String toString()
{
String output = "Policy Information:\n";
output = output + "Policy #: " + this.getPolicyNum() + "\n";
// your code here, finish the output string
output = output + "Face Value" + this.getFaceValue() + "\n";
output = output + "Policy Years:" + this.getPolicyYrs() + "\n";
output = output + "Beneficiary" + this.getBeneficiary() + "\n";
return output;
}
}
測試類別:
/**
* Test the toString method.
*/
@Test
public void testToString()
{
String num = "WLP1234567";
double value = 50000.0;
int years = 20;
String name = "Katie Perry";
WholeLifePolicy policy = new WholeLifePolicy(num, value, years, name);
String text = policy.toString();
assertTrue(text.contains("Policy Information:"));
assertTrue(text.contains("Policy #:"));
assertTrue(text.contains(num));
// your code here, finish the testing of the toString() method
// checking for both the headings and face value, policy years
assertTrue(text.contains("Face Value:"));
assertTrue(text.contains(num));
assertTrue(text.contains("Policy Years:"));
assertTrue(text.contains(num));
assertTrue(text.contains("Beneficiary:"));
assertTrue(text.contains(num));
}
}
您要測試的東西沒有任何難以模擬的依賴關系。 測試這應該很容易。 使用contains使用多個測試實際上容易出錯,因為它引入了復雜性。 保持簡單明了。
這可能像
@Test
public void toString() {
WholeLifePolicy policy = new WholeLifePolicy("WLP1234567",
50000.0, 20, "Katie Perry");
String expected = "Policy Information:\nPolicy #: WLP1000000\n"
+ "Policy Years: 20\nFace Value: 50000.0\nBeneficiary: John Doe\n";
assertEquals(expected, policy.toString());
}
這將檢查您輸入的值是否按預期顯示。 如果斷言失敗,則錯誤消息將告訴您不匹配的位置。 硬編碼期望的字符串是可以的,您不需要使用與設置測試相同的值。 如果這樣做了,那么您將要復制測試方法中使用的相同代碼,這將需要大量工作(不僅是前期工作,而且每次代碼更改時)。
這里最大的現實問題是換行符的使用。 通常,開發人員可以在公司要求的Windows上本地運行測試,並由CI在具有不同行尾的其他平台上執行測試。 如果我希望無論行尾如何都可以工作,我可以將toString更改為使用System.getProperty(“ line.separator”),然后將測試更改為類似
static String lines(List<String> strings) {
String delimiter = System.getProperty("line.separator");
StringBuilder builder = new StringBuilder("");
for (String s : strings) {
builder.append(s);
builder.append(delimiter);
}
return builder.toString();
}
@Test
public void testToString() {
WholeLifePolicy policy = new WholeLifePolicy("WLP1234567",
50000.0, 20, "Katie Perry");
List<String> expectedLines = new ArrayList<String>();
expectedLines.add("Policy Information:");
expectedLines.add("Policy #: WLP1000000");
expectedLines.add("Policy Years: 20");
expectedLines.add("Beneficiary: John Doe");
assertEquals(lines(expectedLines), policy.toString());
}
實際上是因為a)我很懶,並且b)toStrings中的換行符使看起來雜亂無章的日志文件更容易使用,所以我避免在toString方法中使用行分隔符。
這可能是一個練習,旨在教您如何調用方法以及如何查找API文檔(兩者都是重要的生存技能)。 String#contains方法將CharSequence作為參數(String實現),因此您需要將變量轉換為String才能使用它。 如果您有引用類型,則可以在其上調用toString,對於原語,您可以查找包裝器類型,然后將原語轉換為包裝器類型,或者找到采用該原語並將其轉換為String的靜態方法(請參閱API) java.lang.Double的文檔 )。
您可以在執行測試時將double類型的value
解析為字符串。
顯然,您必須完成缺失值的測試。 Num已被測試包含在toString
方法中。
現在,您應該測試toString
方法的輸出中包含的其余屬性。
例如,您可以使用一個空字符串來強制轉換為字符串:
assertTrue(text.contains("Face Value:"));
// this converts 'value' to string
assertTrue(text.contains("" + value));
此方法也應該起作用:
assertTrue(text.contains(Double.toString(value)));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.