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

Nic*_*ner 90 java testing junit compiler-errors package

我有一些测试工作正常.然后,我将它移动到另一个包,现在我遇到了错误.这是代码:

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"));
    }
Run Code Online (Sandbox Code Playgroud)

错误消息是这样的:

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

我怎样才能解决这个问题?为什么在将类移到另一个包时会出现此问题?

Pas*_*ent 196

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

这个错误是什么意思是,你传递double和和Double成拥有两个不同的签名的方法:assertEquals(Object, Object)assertEquals(double, double)这两方面都可以被调用,由于自动装箱.

为了避免歧义,请确保你要么assertEquals(Object, Object)(通过传递两个双打)或assertEquals(double, double)(通过传递两个双打).

所以,在你的情况下,你应该使用:

assertEquals(Double.valueOf(70), eccen.get("alpha"));
Run Code Online (Sandbox Code Playgroud)

要么:

assertEquals(70.0d, eccen.get("alpha").doubleValue());
Run Code Online (Sandbox Code Playgroud)

  • 解决方案并非真正从一个版本切换到另一个版本.相反,帮助编译器并消除我建议的歧义. (7认同)
  • @mahller不确定你在跟谁说话,但是,即使它比OP的代码更正确,如果JUnit的版本同时具有`assertEquals(Object,Object)`和`assertEquals(double,double)`,它仍然是不明确的JUnit 4.4,4.5的情况.但正如我所说,更改JUnit的版本并不是真正的解决方案,只需解决问题. (3认同)
  • @Rosarch 对于这种特殊情况,它在 JUnit 3.8.1 中不是问题,在 JUnit 4.3 中不是问题,在 JUnit 4.4 中**是**问题,在 JUnit 4.4 中**是**问题JUnit 4.5(但不推荐使用 2 个双精度的方法),在 JUnit 4.6 中不是问题(该方法已被删除)。所以,做出你的选择,但你应该修复代码。 (2认同)