Java JUnit:タイプXのメソッドXはあいまいです
-
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
を2つの異なる署名を持つメソッドに渡すことです: assertEquals(Object、Object)
および assertEquals(double、double)
オートボクシングのおかげで、どちらも呼び出すことができました。
あいまいさを避けるため、 assertEquals(Object、Object)
(2つのDoubleを渡す)または 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);
これは、2つの値が0.0001未満で異なる限り、等しいと見なされることを意味します。これには2つの利点があります:
- 想定される浮動小数点値を比較します
- キャストする必要はありません。3つの引数アサートはジェネリックオブジェクトではなくdoubleにのみ適用されるためです
この問題の最も簡単な解決策は、2番目のパラメーターをプリミティブにキャストすることです:
assertEquals(70, (double)eccen.get("alpha"));
曖昧性が削除されました。
これは、Numberサブクラスのいずれにも有効です。例:
assertEquals(70, (int)new Integer(70));
あいまいさも解決します。
ただし、assertEquals(double、double)は現時点では非推奨であり、正当な理由があるため、他の人がすでに提案しているように、デルタを使用してメソッドを使用することをお勧めします。
正当な理由により、二重数の内部表現を考えると、2つの明らかに等しい二重数は無関係な無限小数で異なる可能性があり、テストに合格しませんが、それはあなたに問題があるという意味ではありませんコード。