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

时间:2009-11-28 00:21:09

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

错误信息是:

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

是不明确的

我该如何解决这个问题?为什么在将类移到另一个包时会出现此问题?

3 个答案:

答案 0 :(得分:186)

方法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());

答案 1 :(得分:1)

您可以使用方法

assertEquals(double expected, double actual, double delta)

其中将考虑对浮点有影响的舍入误差(例如,请参阅this post)。你可以写

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

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

  • 比较浮点值,因为它们应该
  • 无需强制转换,因为三个参数断言仅适用于双精度,而不适用于通用对象

答案 2 :(得分:0)

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

import           Control.Monad
import           Control.Monad.ST
import           Data.Array.ST
import qualified Data.Array.Unboxed as U
import           Data.Char          (digitToInt, isDigit)
import           Data.List          (zip)

data Cell = Cell
  { values   :: Word16
  , original :: Bool
  } deriving (Show)

parse input =
  runSTUArray $
  U.array ((0, 0), (8, 8)) $
  map
    (\(i, d) ->
       ( (quot i 9, mod i 9)
       , if isDigit d && d /= '0'
           then Cell {values = bit $ digitToInt d, original = True}
           else Cell {values = 2 ^ 11 - 2, original = False})) $
  zip [0 ..] input

消除歧义。

这适用于任何Number子类,例如:

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

也会解决歧义。

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

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