【问题标题】:Java JUnit: The method X is ambiguous for type YJava JUnit:方法 X 对于类型 Y 不明确
【发布时间】:2010-12-21 03:10:33
【问题描述】:

我有一些测试工作正常。然后,我将它移到另一个包中,现在出现错误。代码如下:

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 类型不明确

我该如何解决这个问题?为什么当我将类移到不同的包时会出现此问题?

【问题讨论】:

  • 告诉我们你的类是如何声明的。在我看来,您好像从 JUnit3 继承,然后尝试从 JUnit4 静态导入。
  • 是的,实际上,我在包 A 中有 JUnit3,在包 B 中使用了 JUnit4,我最初在包 B 中编写了这些测试。然后我从Package B切换到Package A,问题就出现了。但是我在这个类中看不到任何表明 JUnit 3 的东西。它在哪里声明?
  • @Rosarch 这些 JGraphtUtilities 随处可用吗?我看不到在 JGraphT 中产生偏心的方法!

标签: java testing junit compiler-errors package


【解决方案1】:

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

此错误的意思是您将 doubleDouble 传递到具有两个不同签名的方法中:assertEquals(Object, Object)assertEquals(double, double) 都可以调用,这要归功于自动装箱。

为避免歧义,请确保您调用assertEquals(Object, Object)(通过两个双精度数)或assertEquals(double, double)(通过两个双精度数)。

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

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

或者:

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

【讨论】:

  • 好的,或者我可以将其切换为使用 JUnit 4 而不是 JUnit 3。我该怎么做?
  • 解决方案并不是真正从一个版本切换到另一个版本。相反,请按照我的建议帮助编译器并消除歧义。
  • 反正不应该是assertEquals(70.0d, eccen.get("alpha")); ?
  • @mahller 不确定您在与谁交谈,但即使它比 OP 的代码更正确,如果 JUnit 的版本同时具有 assertEquals(Object, Object)assertEquals(double, double) 仍然是模棱两可的JUnit 4.4、4.5 的。但正如我所说,改变 JUnit 的版本并不是真正的解决方案,只是解决问题。
  • @Rosarch 对于这种特殊情况,在 JUnit 3.8.1 中不是问题,在 JUnit 4.3 中不是问题,在 JUnit 中问题4.4,它在 JUnit 4.5 中一个问题(但不推荐使用 2 双打的方法),在 JUnit 4.6 中它不是问题(该方法已被删除)。所以,做出你的选择,但你应该修复代码。
【解决方案2】:

你可以使用方法

assertEquals(double expected, double actual, double delta)

这将考虑到浮点数的舍入误差(例如,参见this post)。你可以写

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

这意味着只要两个值相差小于 0.0001,它们就被认为是相等的。这有两个好处:

  • 按预期比较浮点值
  • 无需强制转换,因为三个参数 assert 仅适用于双精度对象,不适用于通用对象

【讨论】:

    【解决方案3】:

    解决这个问题最简单的方法就是将第二个参数转换成一个原语:

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

    消除歧义。

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

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

    也可以解决歧义。

    但是,assertEquals(double, double) 到目前为止已被弃用,并且有充分的理由,所以我鼓励您使用其他人已经建议的带有 delta 的方法。

    有充分的理由我的意思是,鉴于双数的内部表示,两个明显相等的双数可以在不相关的无穷小分数上有所不同,并且不会通过测试,但这并不意味着你的有什么问题代码。

    【讨论】:

      猜你喜欢
      • 2016-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多