Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JAVA中对字符串的单元测试_Java_Unit Testing_Tostring - Fatal编程技术网

JAVA中对字符串的单元测试

JAVA中对字符串的单元测试,java,unit-testing,tostring,Java,Unit Testing,Tostring,如何在JAVA中测试toString?我想这和常规测试的概念是一样的,但我确实有很多问题。我在我的大JAVA教科书中找不到这些信息。我已经阅读了所有章节,我们已经涵盖了至少5次没有。我只是看不出来,而且这在任何家庭作业中都没有涉及 首先,我不明白在第一个示例中提供代码的单元测试中,我的老师在assertTrue(text.contains(num))中放置了“num” 我想她之所以把num放在这里是因为我们遵循的是全生命政策的形式。前 WholeLifePolicy policy = new W

如何在JAVA中测试toString?我想这和常规测试的概念是一样的,但我确实有很多问题。我在我的大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类,后面是test类

为什么使用“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;

    }

}

执行测试时,您可以将双精度类型
解析为字符串。

显然,您必须完成缺少值的测试。Num已测试为包含在
toString
方法中

现在,您应该测试
toString
方法输出中包含的其余属性

例如,您可以使用空字符串强制转换为字符串:

assertTrue(text.contains(Double.toString(value)));
这种方法也应适用于:

@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());
}

您正在测试的东西没有任何难以模拟的依赖项。测试应该很容易。使用包含项进行多个测试实际上很容易出错,因为这会引入复杂性。请保持简单明了

这可能很容易

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());
}
这将检查您输入的值是否按预期表示。如果断言失败,则错误消息将告诉您不匹配的位置。对预期字符串进行硬编码是可以的,您不需要使用设置测试时使用的相同值。如果使用了,则将复制在m中使用的相同代码您正在测试的方法,这将是大量的工作(不仅仅是前期工作,而且每次代码更改时)

这里最大的实际问题是换行符的使用。通常,开发人员可能会在公司授权的Windows上本地运行测试,并让CI在其他具有不同行尾的平台上执行测试。如果我希望不管行尾如何都能运行测试,我会将toString更改为使用System.getProperty(“line.separator”)我会把测试改成

静态字符串行(列出字符串){
字符串分隔符=System.getProperty(“line.separator”);
StringBuilder=新的StringBuilder(“”);
用于(字符串s:字符串){
建造商。附加;
builder.append(分隔符);
}
返回builder.toString();
}
@试验
public void testToString(){
全局策略=新的全局策略(“WLP1234567”,
50000.0,20,“凯蒂·佩里”);
List expectedLines=new ArrayList();
expectedLines.add(“策略信息:”);
expectedLines.add(“Policy#:WLP1000000”);
预期额度。添加(“保单年数:20”);
预期行。添加(“受益人:John Doe”);
assertEquals(行(预期行),policy.toString());
}
实际上,因为a)我很懒,b)toString中的换行符会导致日志文件看起来杂乱无章,所以我避免在toString方法中使用行分隔符


这可能是一个练习,旨在教授如何调用方法以及如何查找API文档(这两项都是重要的生存技能)。String#contains方法将CharSequence作为参数(String实现的参数),因此您需要将变量转换为字符串才能使用它。如果您有引用类型,则可以对其调用toString,对于原语,您可以查找包装类型并将原语转换为包装类型,或者找到接受原语并将其转换为字符串的静态方法(请参阅).

这是一个好问题。因为这本Java大书只在两页纸上简要介绍了单元测试,我完全搞不懂这些测试实际上是如何测试的,以及它们是如何或是否与常规类连接的。我真的需要为初学者编写的信息,用初学者语言,这些信息可以在为了区分不同的部分,并解释每个部分的作用和原因。经过许多小时,我仍然在努力学习这个toString类。我感谢您的深入解释,这真的很有帮助。不幸的是,我根本不允许更改测试用例。我只允许在下面添加代码,上面写着//add your code here。@jforrest1980:ok,检查contains方法,它需要一个字符串。您可以对参数调用toString,以便传入该方法的是字符串。
@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());
}
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());
}