java - Junit 测试用例没有按预期工作

标签 java junit

我有以下用于测试求幂的 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 ==),并且它仅适用于引用类型 (see the Javadoc)。在你的例子中,你的指数方法返回一个值类型(double),你传递给 assertSame() 方法的预期结果也是一个值类型( float ).

当 Java 在需要引用类型的任何地方找到值类型时,它会执行自动装箱 ( you can read about it here ),从而创建与值类型匹配的引用类型的新实例(例如 Floatfloat)。在您的情况下,这基本上是在后台发生的事情:

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() 方法之一。

第二个错误是其他答案说,由于 float 的精度有限,您必须将它们与一些公差(或增量)进行比较。幸运的是,您不必为每个 float 比较手动执行此操作,因为 JUnit 为您提供了完美的 assertEquals() 方法用于此目的 (here's the 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

关于java - Junit 测试用例没有按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8880685/

相关文章:

java - Android 将我的应用程序添加到库中的 "Share"按钮

java - java中打印带有两位小数的 double 问题

scala - 如何将 scalatest 标签添加到报告中?

java - 如何进行 jUnit 测试

java - 为什么我无法从此枚举中获取所需的数据?

java - 如何打印 json 对象和数组值?

java - doThrow 异常不抛出 Spring MVC 单元测试?

java - 检测代码中的故障

java - 未捕获或未抛出预期异常?

java - 我可以在不更改java代码的情况下在浏览器中打开webview链接吗?