[英]Spock test case doesn't work without JUnit's @Test annotation
[英]Junit test case doesn't work as expected
我有以下用于测试指数的jUnit测试用例
@Test
public void testExponentiation() {
AssertSame("Not valid!",32.0,this.myObject.expo(2,5))
}
我的博览会功能是
public double expo(int n1,int n2) {
return Math.pow(n1,n2);
}
这不能按预期工作,但是AssertSame
可以与Integer基本类型很好地工作。有人可以解释为什么吗?
您的代码中有两个错误:
首先, assertSame()
仅可用于确定两个参数是否引用同一对象 (例如,引用相等,就像使用operator ==
),并且仅适用于引用类型( 请参阅Javadoc ) 。 在您的情况下,指数方法返回值类型( double
),并且传递给assertSame()
方法的预期结果也是值类型( float
)。
当Java在期望引用类型的任何位置找到值类型时,它将执行自动装箱 ( 您可以在此处阅读有关内容 ),从而创建与值类型匹配的引用类型的新实例(例如Float
for float
)。 在您的情况下,这基本上是在后台发生的:
assertSame("Not valid!", new Double(32.0), new Double(this.myObject.expo(2,5)))
或者更确切地说:
assertSame("Not valid!", Double.valueOf(32.0), Double.valueOf(this.myObject.expo(2,5)))
由此,您可以清楚地看到,这两个引用将永远不会相同,因为它们是两个不同的对象。 为了比较值,您必须使用assertEquals()
方法之一。
第二个错误是其他答案说,由于浮点数的精度有限,您必须将它们与某个容差(或增量)进行比较。 幸运的是,您不必为每个浮点比较手动进行操作,因为JUnit为此提供了完美的assertEquals()
方法(以下是Javadoc ):
public static void assertEquals(java.lang.String message,
float expected,
float actual,
float delta)
它期望一个期望值,一个实际值以及用于比较期望值和实际值的容差。 如果使用此方法,则代码将如下所示:
@Test
public void testExponentiation() {
assertEquals("Not valid!", 32.0, this.myObject.expo(2,5), 1e-5);
}
希望它能够成功运行并通过测试。
编辑 : assertSame()
为您工作的整数的原因是Java缓存从-128到127的整数以节省内存。 这意味着调用Integer.valueOf(5)
将始终返回相同的Integer
实例,因此它们的引用将相等。 试试这个小例子:
Integer i1 = 6; // Autoboxing, Integer.valueof(6)
Integer i2 = Integer.valueOf(6);
Integer i3 = new Integer(6);
i1 == i2; // True, their references are the same
i2 == i3; // False
i1 == i3; // False
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.