java - 缩放方法无法满足 JUnit

标签 java junit

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

用于规模的 JUnit:

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 等于:

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

最佳答案

您一次测试的东西太多了。

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

我还注意到您没有任何用 @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() {

}

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

处理 float 时要非常小心。您不会总是得到精确的表示(也就是说,在处理分数时您可能会得到不精确的值)。确保您的 equals 方法定义良好,以考虑当您没有精确的十进制值可供使用时可能发生的情况。

或者,如果您确实需要小数精度,请使用 BigDecimal相反。

关于java - 缩放方法无法满足 JUnit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18680217/

相关文章:

java - 为 Kryo 序列化程序编写单元测试

java - Spring Mail Integration - 我如何将 org.springframework.messaging.Message 转换为 javax.mail.internet.MimeMessage

java - 在调用 JTabbedPane.removeAll() 之后,JTabbedPane 仍然有 x 个选项卡?

java - 你如何在 apache camel 中对 servlet 端点进行单元测试?

android - Gradle connectedAndroidTest 失败并显示 "No tests found."但输出测试结果

java - 如何成功地结合这两个 JUnit 测试的逻辑?

java - 为什么我的 public void Constructor {} 不能编译?

java - MIDI 乐器列表?

java - 尝试使用标准差java

java - Selenium 2 WebDriver NoClassDefFoundErrorS