gpt4 book ai didi

java - JAVA 中的 toStrings 单元测试

转载 作者:行者123 更新时间:2023-11-30 07:51:30 24 4
gpt4 key购买 nike

如何在 JAVA 中测试 toString?我想这与常规测试是相同的概念,但我确实遇到了很多问题。我在我的 Big JAVA 教科书中找不到任何此类信息。我已经读过我们所涵盖的所有章节至少 5 遍了。我只是没有看到这一点,而且任何作业中都没有涉及到这一点。

首先,我不明白第一个示例中提供的代码在单元测试中的哪个位置,我的老师将“num”放入了assertTrue(text.contains(num));

我认为她输入 num 是因为我们遵循 WholeLife 保单的格式。例如。

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

我想既然这是一个例子,我就会做同样的事情,例如对于如下所示的面值。

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

这不能编译,因为它说它不兼容,因为数字是 double 的。所以我尝试了双倍。唯一编译的是“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));



}
}

最佳答案

您正在测试的东西没有任何难以模拟的依赖项。测试这个应该很容易。使用 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 ,对于基元,您可以查找包装类型并将基元转换为包装类型,或者查找采用基元并将其转换为字符串的静态方法(请参阅 the API documentation for java.lang.Double ) .

关于java - JAVA 中的 toStrings 单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33294466/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com