我正在尝试根据给定的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
答案 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 true
和return 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
。