繁体   English   中英

Junit测试用例无法按预期工作

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM