模糊方法调用Assert中的assertEquals(Object,Object)和Assert匹配中的assertEquals(double,double):

时间:2017-01-27 12:06:59

标签: java object junit double assert

我收到以下错误:

Both assertEquals(Object, Object) in Assert and assertEquals(double, double) in Assert match

对于我的Junit测试中的这行代码,请注意getScore()返回double

assertEquals(2.5, person.getScore());

这是我的断言导入:

import static org.junit.Assert.*;

造成这种情况的原因是什么?如何解决这个问题?

4 个答案:

答案 0 :(得分:26)

我猜你的getScore()会返回Double,而不是double。因此编译器很困惑:他应该将两个参数都转换为Object,还是应该只将Double转换为double?

    double a = 2.0;
    Double b = 2.0;
    // assertEquals(a,b); // fails to compile
    // the compiler is confused whether to use
    assertEquals((Object) a,(Object) b); // OK
    // or
    assertEquals(a,(double) b); // OK

无论如何,我会设置方法返回基本类型double。

答案 1 :(得分:3)

如果您对使用Assert.assertEquals(double, double)(原始版本)特别感兴趣,请尝试调用允许偏差并将允许偏差设置为零的重写方法,如下所示:

assertEquals(2.5, person.getScore(), 0.0);

如果允许person.getScore()2.5略有不同,您可能还希望第三个参数为零以外的其他参数。例如,如果2.500001可以接受,则您的测试将变为

assertEquals(2.5, person.getScore(), 0.000001);

答案 2 :(得分:0)

如果您特别想避免强制转换并使用原始版本,则可以从包装对象获取原始结果。例如:

    double a = 2.0;
    Double b = 2.0;
    assertEquals(a, b.doubleValue()); //Deprecated so use the one with delta

    Integer c = 2;
    int d = 2;
    assertEquals(c.intValue(), d);

    Long e = 2L;
    long f = 2L;
    assertEquals(e.longValue(), f);

答案 3 :(得分:0)

我有相同的错误,我对此进行了更改:

assertEquals("Server status code is: " +  wmResp.getStatusCode() , 200, wmResp.getStatusCode());

对此

assertEquals("Server status code is: " +  wmResp.getStatusCode() , new Integer(200), wmResp.getStatusCode());

之所以发生这种情况,是因为第一行编译器将200作为原始类型(整数而不是Integer类)