2015-10-23 33 views
1

如何在JAVA中測試toString?我想這和普通測試是一樣的概念,但我真的有很多問題。在我的Big JAVA教科書中找不到這些信息。我已閱讀了至少5次所有章節。我只是沒有看到它,而這在任何作業中都沒有涉及。JAVA中的單元測試toStrings

對於其中一個,我不明白在第一個例子中代碼的單元測試中,我的老師在assertTrue(text.contains(num))中放入了「num」;

我覺得她把num放進去,因爲我們遵循WholeLife策略的格式。防爆。

WholeLifePolicy policy = new WholeLifePolicy(num, value, years, name); 

我以爲這是一個例子,我會做同樣的事情,例如面值如下所示。

assertTrue(text.contains("Face Value:")); 
     assertTrue(text.contains(value)); 

這不會編譯,因爲它表示它不兼容,因爲數字是雙精度型。所以我嘗試了兩次。唯一編譯的是「num」

所以很明顯,我的測試都沒有通過。這是我的代碼。對於WholeLifePolicy類,請遵循測試類。

爲什麼使用「num」?它是否因爲它是策略對象的顯式參數?或者是僅僅因爲一個數字是在那裏」或其他原因

顯然我所有的代碼是低於//評論其他的一切在實驗室源還

/** 
    * 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)); 



    } 
} 
+0

這是一個很好的問題。這是因爲這本Big Java書籍非常簡短地介紹了2頁的單元測試,而且我完全搞不清楚這些測試是如何測試事情的,以及它們如何甚至是連接到普通課程。我真的需要爲初學者編寫的初學者信息,它將單元測試分解成不同的部分,並解釋每個部分的作用和原因。我在許多,許多小時之後仍然在爲這個toString類而努力。 – jforrest1980

回答

0

您可以在執行測試時顯然解析double類型value爲一個字符串。

0

你必須完成你的檢查失蹤VA梅毒。 Num已經被測試包含在toString方法中。

現在您應該測試toString方法的輸出中包含的其餘屬性。

例如,你可以使用一個空字符串強制轉換爲字符串:

assertTrue(text.contains("Face Value:")); 
// this converts 'value' to string 
assertTrue(text.contains("" + value)); 

這種方法也應該工作:

assertTrue(text.contains(Double.toString(value))); 
1

你測試沒有任何依賴的東西這很難嘲笑。測試這應該很容易。使用包含的多個測試實際上是容易出錯的,因爲它引入了複雜性。保持簡單直接。

這可能是那麼容易,因爲

@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(參見the API documentation for java.lang.Double) 。

+0

我很感謝你的深入解釋,這真的有所幫助。不幸的是,我不允許改變測試用例。我只允許在下面添加我的代碼,它說//在此處添加您的代碼。 – jforrest1980

+0

@ jforrest1980:好的,檢查包含方法,它需要一個字符串。你可以在參數上調用toString,這樣你傳遞給方法的就是一個字符串。 –