Java JUnit:方法 X 对于类型 Y 来说不明确
-
06-07-2019 - |
题
我进行了一些测试,工作正常。然后,我将其移动到另一个包,现在出现错误。这是代码:
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不明确
我怎样才能解决这个问题?当我将类移至不同的包时,为什么会出现此问题?
解决方案
方法assertEquals(Object,Object)对于类型...
是不明确的此错误的含义是您将 double
和 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());
其他提示
你可以使用该方法
assertEquals(double expected, double actual, double delta)
这将考虑浮点数固有的舍入误差(请参阅 这个帖子 例如)。你可以写
assertEquals(70, eccen.get("alpha"), 0.0001);
这意味着只要两个值相差小于 0.0001,它们就被视为相等。这样做有两个优点:
- 按预期比较浮点值
- 无需强制转换,因为三个参数断言仅适用于双精度数,不适用于泛型对象
解决此问题的最简单方法是将第二个参数转换为基元:
assertEquals(70, (double)eccen.get("alpha"));
消除歧义。
这适用于任何Number子类,例如:
assertEquals(70, (int)new Integer(70));
也会解决歧义。
但是,assertEquals(double,double)现在已被弃用,并且有充分的理由,所以我建议您使用带有delta的方法,正如其他人已经建议的那样。
由于充分的理由,我的意思是,鉴于双数的内在表示,两个明显相等的双数可以在无关的无穷小部分中有所不同并且不会通过测试,但这并不意味着你的任何问题代码。
不隶属于 StackOverflow