Java JUnit:タイプXのメソッドXはあいまいです
いくつかのテストが正常に機能しました。その後、別のパッケージに移動しましたが、現在エラーが発生しています。コードは次のとおりです。
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
を2つの異なるシグネチャを持つメソッドに渡すことです: assertEquals(Object, Object)
と- assertEquals(double, double)
両方ともオートボクシングのおかげで呼び出すことができました。
あいまいさを避けるために、必ず assertEquals(Object, Object)
(2つのDoubleを渡すこと)または assertEquals(double, double)
(2つ渡すことで)ダブル)。
したがって、あなたの場合、あなたは使用すべきです:
assertEquals(Double.valueOf(70), eccen.get("alpha"));
または:
assertEquals(70.0d, eccen.get("alpha").doubleValue());
メソッドを使用できます
assertEquals(double expected, double actual, double delta)
浮動小数点へのハイレントな丸め誤差を考慮します(たとえば、 this post を参照)。あなたは書ける
assertEquals(70, eccen.get("alpha"), 0.0001);
これは、0.0001未満で2つの値が異なる限り、等しいと見なされることを意味します。これには2つの利点があります。
- 想定される浮動小数点値を比較します
- 3つの引数アサートは、汎用オブジェクトではなく、倍精度のみに適用されるため、キャストする必要はありません。
この問題の最も簡単な解決策は、2番目のパラメーターをプリミティブにキャストするだけです。
assertEquals(70, (double)eccen.get("alpha"));
あいまいさが削除されました。
これは、Numberサブクラスのいずれにも有効です。たとえば、次のとおりです。
assertEquals(70, (int)new Integer(70));
あいまいさも解決します。
ただし、assertEquals(double、double)は、現在および正当な理由により非推奨になっているため、他のユーザーが既に提案しているように、デルタを使用してメソッドを使用することをお勧めします。
正当な理由により、二重数の内部表現を考えると、2つの明らかに等しい二重数は無関係な無限小数で異なる可能性があり、テストに合格しませんが、それはあなたのコードに問題があることを意味しません。