如何在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));
这不会编译,因为它说它不兼容,因为数字是双倍的。所以我尝试了双倍。编译的唯一内容是" 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 CLASS:
/**
* 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 :(得分:1)
您正在测试的东西没有任何难以模拟的依赖项。测试这应该很容易。使用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(&#34; line.separator&#34;)并且我将测试更改为
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(参见{{ 3}})。
答案 1 :(得分:0)
执行测试时,您可以将双精度类型value
解析为字符串。
答案 2 :(得分:0)
显然,您必须完成缺失值的测试。 Num已经过测试,包含在toString
方法中。
现在您应该测试toString
方法的输出中包含的其余属性。
例如,您可以使用空字符串强制转换为字符串:
assertTrue(text.contains("Face Value:"));
// this converts 'value' to string
assertTrue(text.contains("" + value));
此方法也应该有效:
assertTrue(text.contains(Double.toString(value)));