簡體   English   中英

在JAVA中對字符串進行單元測試

[英]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.

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