覆盖对象的toString()表示返回意外符号

时间:2012-11-01 16:47:11

标签: java junit junit4 tostring primitive-types

我正在为Clock类编写一个JUnit测试方法,以确保对象的toString表示以我想要的格式返回。所以,我已经覆盖了toString()并将其编写为希望它被表示,但是当我将它与我在JUnit中期望的格式进行比较时,它会失败并显示以下内容:

org.junit.ComparisonFailure:expected:<时间:10:0 [0:0] 0>但是:<时间:10:0 [:] 0>

为什么符号[和]会显示在这里?它是toString()表示的一部分,我不知道吗?相关代码如下:

JUnit的:

    @Test
public void testFormattingOfTimeIsDisplayedCorrectly() {

    final byte TEN = 10;
    final byte DBL_ZERO = 00;

    clock.setTime(TEN, DBL_ZERO, DBL_ZERO);

    final String EXPECTED_STRING = "Time : 10:00:00";

    assertEquals(EXPECTED_STRING, clock.toString());    

}
Clock类中的

toString():

@Override
public String toString() {
    return "Time : " + hours + ":" + minutes + ":" + seconds;
}

和setTime方法也在Clock类中:

public void setTime(byte hour, byte minutes, byte seconds) {

    this.hours = hour;
    this.minutes = minutes;
    this.seconds = seconds;

}

我想知道,也许它与使用字节有关?或者它是什么toString()返回我不明白的东西。我只是很困惑为什么我的JUnit方法不会将它们视为相同的格式。

3 个答案:

答案 0 :(得分:6)

此:

<10:0[0:0]0 > but was:< Time : 10:0[:]0>

表示不同。即输出为10:0:0而不是10:00:00。鉴于您的代码执行此操作,这并不奇怪:

return "Time : " + hours + ":" + minutes + ":" + seconds;

并且分钟/秒不是零填充。也许可以使用String.format()格式设置查看%02d。我不明白(也)你为什么要使用byte作为值。 int将是一种更常用的类型。

答案 1 :(得分:1)

替换为:

return "Time : " + String.format("%02d", hours) + ":" + String.format("%02d", minutes) + ":" + String.format("%02d", seconds);

答案 2 :(得分:0)

它指出你的方法返回10:0:0而不是10:00:00。数字类型不存储前导零,因此您的DBL_ZERO常量不能以您希望的方式工作。

试试这个:

@Override
public String toString() {
    return "Time : " + hours + ":"
        + (minutes < 10 ? "0" : "") + minutes + ":"
        + (seconds < 10 ? "0" : "") + seconds;
}