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


98

我的一些测试工作正常。然后,我将其移至其他程序包,现在出现错误。这是代码:

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

错误消息是这样的:

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

我怎样才能解决这个问题?当我将类移至其他程序包时,为什么会发生此问题?


告诉我们如何声明您的课程。在我看来,您好像已继承自JUnit3,然后尝试从JUnit4静态导入。
bmargulies

是的,实际上我在程序包A中有JUnit3,并在程序包B中使用了JUnit4,我最初是在其中编写这些测试的。然后我从程序包B切换到程序包A,问题出现了。但是我在此类中看不到任何表明JUnit 3的东西。
Nick Heiner

@Rosarch这些JGraphtUtilities在任何地方都可用吗?我看不到在JGraphT中产生偏心率的方法!
尼克

Answers:


205

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

此错误的含义是,您正在将doubleand和传递给Double具有两个不同签名的方法:由于自动装箱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而不是JUnit3。我该怎么做?
尼克·海纳尔

8
解决方案并不是真正从一个版本切换到另一个版本。相反,请按照我的建议帮助编译器并消除歧义。
Pascal Thivent 09年

1
无论如何,不​​应该是assertEquals(70.0d,eccen.get(“ alpha”)); ?
mhaller

3
@mahller不知道您在和谁说话,但是,即使它比OP的代码更正确,但如果JUnit的版本同时具有两者assertEquals(Object, Object)assertEquals(double, double)例如JUnit 4.4、4.5),则仍然不明确。但是正如我所说,更改JUnit版本不是真正的解决方案,只需解决问题即可。
Pascal Thivent 09年

1
@Rosarch对于这个特定的情况下,它不是在JUnit的3.8.1中的问题,它不是在JUnit的4.3的一个问题,它在4.4的JUnit一个问题,它在4.5的JUnit的问题(但是该方法取2不推荐使用doubles),在JUnit 4.6中这不是问题(该方法已删除)。因此,做出选择,但是您应该修复代码。
Pascal Thivent 09年

1

您可以使用方法

assertEquals(double expected, double actual, double delta)

这将考虑到浮点数附近的舍入错误(例如,请参阅此文章)。你可以写

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

这意味着只要两个值的差异小于0.0001,就将它们视为相等。这有两个优点:

  • 比较浮点值,因为它们应该
  • 不需要强制转换,因为三个参数assert仅适用于double,不适用于通用Objects

0

解决此问题的最简单方法是将第二个参数转换为原始值:

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

歧义已删除。

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

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

也将解决歧义。

但是,断言assertEquals(double,double)到现在为止是有充分的理由的,因此,我建议您像其他人已经建议的那样,使用带有增量的方法。

出于充分的理由,我的意思是,给定双精度数的内部表示形式,两个看似相等的双精度数可以以不相关的无穷小数部分进行区别,并且不会通过测试,但这并不意味着您的代码有任何问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.