缩放方法无法满足JUnit

时间:2013-09-08 03:52:47

标签: java junit

我正在尝试根据给定的JUnit创建位置,长度和圆类,以便最终以图形方式输出它们。但是我现在已经陷入其中一种方法了。 我试图截断精度,但我的equals方法失败了。

JUnit for Scale:

public void testScale(){
    Length inch2 = Length.unit.scale(320.0);
    assertTrue(inch2 != null);
    assertEquals(Length.inch,inch2);
    assertFalse(inch2.equals(Length.unit)); 
    Length unit2 = Length.cm.scale(1.0/125.98425197);
    assertTrue(unit2 != null);
    assertEquals(Length.unit,unit2); // This is the line my scale method fails
                                     // Here my unit2 has a length of 1.0001249999881234
                                     // and my constant cm has a length of 1.0 but 
                                     // truncating those precisions caused my equals                                   
                                     // method to fails.  
    assertFalse(unit2.equals(Length.cm));
    Length z = Length.meter.scale(0);
    assertTrue(z != null);
    assertEquals(Length.zero,z);
    assertFalse(z.equals(Length.meter));
    assertFalse(Length.zero.equals(null));
}

我的缩放方法:

public Length scale(double d) {
    if (d < 0)
        throw new IllegalArgumentException();
    else {
        return new Length(d* this.length);
    }
}

我怀疑问题可能来自我的equals方法但是在给定的JUnit中它通过了测试。

JUnit for Equals:

public void testEquals(){
    assertFalse(Length.unit.equals("Not a length"));
    assertFalse(Length.inch.equals(null));
    assertEquals(Length.zero,Length.unit.scale(0.0000001));
    assertTrue(Length.unit.scale(0.0000001).compareTo(Length.zero) == 0);
    assertTrue(Length.zero.compareTo(Length.unit.scale(0.0000001)) == 0);
    assertFalse(Length.unit.scale(0.0000015).equals(Length.zero));
    assertTrue(Length.unit.scale(0.0000015).compareTo(Length.zero) > 0);
    assertTrue(Length.zero.compareTo(Length.unit.scale(0.0000015)) < 0);
}

我的等于方法:

@Override
public boolean equals(Object other) {
    if (other == null || !(other instanceof Length)) {
        return false;
    }
    Length o = (Length) other;
    if (Math.abs(this.length - o.length) < 0.000001) {
        return true;
    } else {
        return false;
    }
}

请帮忙


我所有代码的链接: https://www.dropbox.com/sh/bz400f8y0ufx381/59aUTilrBt

1 个答案:

答案 0 :(得分:1)

您正在同时测试太多内容。

单元测试应该是一个代码单元 - 代码的一个方面,而不是一次完成所有内容。

我还注意到您没有使用@Test注释的任何测试方法;你应该用JUnit4测试来做这件事。

因此,对于您的第一次测试,您需要使用相对较小的scale方法。让我们列举一下案例:

  • d < 0。我应该期待一个IllegalArgumentException
  • d >= 0。我应该期待一个Length的新实例,其大小是d的倍数,无论实例的设置长度是多少。

这看起来像两个离散测试:

@Test(expected = IllegalArgumentException.class)
public void scaleShouldThrowExceptionWhenInvalidLength() {

}

@Test
public void scaleShouldBehaveNormally() {

}

我让你填补空白,因为我不知道附加了什么对象scale

等于是同样的方式 - 你想要运用等价的每个条件。

顺便说一句,您可以根据自己的条件return Math.abs(this.length - o.length) < 0.000001进行操作。 return truereturn false尖叫不良行为。

  • 您传入的对象是null
  • 您传入的对象不是Length的实例。
  • 您传入的对象失败Math.abs(this.length - o.length) < 0.000001
  • 您传入的对象传递Math.abs(this.length - o.length) < 0.000001

所以上面是四个不连续的测试。

@Test
public void equalsShouldFailIfNull() {

}

@Test
public void equalsShouldFailIfNotInstanceOfLength() {

}

@Test
public void equalsDoesNotMeetCondition() {

}

@Test
public void equalsMeetsCondition() {

}

填补空白,我作为练习留给读者。

处理浮点数时要非常小心。你不会总是得到一个精确的表示(也就是说,在处理分数时你可能得到一个不精确的值)。确保您的equals方法定义明确,以便在您没有精确的十进制值时可能会发生这种情况。

或者,如果您确实需要小数精度,请改用BigDecimal