Java 不明确的方法调用Assert中的assertEquals(Object,Object)和Assert match中的assertEquals(double,double):

Java 不明确的方法调用Assert中的assertEquals(Object,Object)和Assert match中的assertEquals(double,double):,java,object,junit,double,assert,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.*; 造成这种情况的原因是什么?我如何解决这

我得到以下错误:

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.*;

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

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

assertEquals(2.5, person.getScore(), 0.0);
如果允许
person.getScore()
2.5
稍有不同,您可能还希望第三个参数不是零。例如,如果
2.500001
是可接受的,那么您的测试将成为

assertEquals(2.5, person.getScore(), 0.000001);
getScore()返回的是
Double
,而不是
Double
。因此,编译器感到困惑:它应该将两个参数都转换为对象,还是只将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。

如果您特别希望避免强制转换并使用原语版本,则可以从包装器对象获得原语结果。例如:

    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);

我也有同样的错误,我改变了这一点:

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

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

之所以会发生这种情况,是因为第一行编译器将200作为原语(integer而不是integer类)

这应该是公认的答案,因为它确实解释了替代方案以及避免了类型转换。你救了我一天。@Mohammaddnan我不认为这是一个不涉及类型转换的通用解决方案。@RomeoSierra请补充一下,为什么你认为这不是一个比上面更好的答案。@RomeoSierra,它解决了
assertEquals(Object,Object)
assertEquals(double,double)
之间选择不明确的问题。对于
assertEquals(Object,Object)
assertEquals(long,long)
(实际上这完全是它自己的独立问题)之间的模糊选择,它不是一个解决方案,主要是因为没有一个方法可以接受3个参数。如果“universal”指的是任何类型的问题的解决方案,包括不明确的方法选择,那么你是对的-事实上,没有这样的解决方案存在,大多数类似的问题都是不同的。我们不应该建议人们使用
Integer
的构造函数和其他类似的包装器类型。自Java 9以来,它被标记为已弃用,自Java 16以来,它被标记为已弃用,并且很快构造函数将被删除!固定的。