Java JUnit:方法X对于Y型是不明确的

2022-08-31 09:59:49

我有一些测试工作正常。然后,我将其移动到其他包,现在收到错误。代码如下:

import static org.junit.Assert.*;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import org.jgrapht.Graphs;
import org.jgrapht.WeightedGraph;
import org.jgrapht.graph.DefaultWeightedEdge;
import org.jgrapht.graph.SimpleWeightedGraph;
import org.junit.*; 

@Test
    public void testEccentricity() {
        WeightedGraph<String, DefaultWeightedEdge> g = generateSimpleCaseGraph();
        Map<String, Double> eccen = JGraphtUtilities.eccentricities(g);

        assertEquals(70, eccen.get("alpha"));
        assertEquals(80, eccen.get("l"));
        assertEquals(130, eccen.get("l-0"));
        assertEquals(100, eccen.get("l-1"));
        assertEquals(90, eccen.get("r"));
        assertEquals(120, eccen.get("r-0"));
        assertEquals(130, eccen.get("r-1"));
    }

错误消息是这样的:

方法 assertEquals(Object, Object) 对于 JGraphtUtilitiesTest 类型是不明确的

我该如何解决这个问题?为什么当我将类移动到其他包时出现此问题?


答案 1

方法 assertEquals(Object, Object) 对于类型 ...

这个错误意味着你正在将一个 and 传递到一个具有两个不同签名的方法中:assertEquals(Object, Object)assertEquals(double,double),这两者都可以被调用,这要归功于自动装箱。doubleDouble

为了避免歧义,请确保调用 assertEquals(Object, Object)(通过传递两个双精度值)或 assertEquals(双精度值,双精度值)(通过传递两个双精度值)。

因此,在您的情况下,您应该使用:

assertEquals(Double.valueOf(70), eccen.get("alpha"));

艺术

assertEquals(70.0d, eccen.get("alpha").doubleValue());

答案 2

这个问题最简单的解决方案是将第二个参数转换为基元:

assertEquals(70, (double)eccen.get("alpha"));

消除了歧义。

这对于任何 Number 子类都有效,例如:

assertEquals(70, (int)new Integer(70));

也会解决歧义。

但是,assertEquals(double,double)现在已经被弃用了,并且有充分的理由,所以我鼓励你像其他人已经建议的那样使用带有delta的方法。

我的意思是,考虑到双精度数的内部表示,两个明显相等的双精度数可以在不相关的无穷小分数中不同,并且不会通过测试,但这并不意味着你的代码有任何错误。


推荐