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

エラーメッセージはこれです:

メソッドassertEquals(Object、Object)はタイプJGraphtUtilitiesTestにはあいまいです

どうすれば修正できますか?クラスを別のパッケージに移動したときにこの問題が発生したのはなぜですか?


クラスの宣言方法を教えてください。JUnit3から継承して、JUnit4から静的にインポートしようとしたように見えます。
bmargulies 09年

実際、私はパッケージAにJUnit3を使用し、パッケージBにJUnit4を使用しました。次に、パッケージBからパッケージAに切り替えたところ、問題が発生しました。しかし、このクラスにはJUnit 3を示すものは何もありません。どこで宣言されていますか?
Nick Heiner、

@RosarchこれらのJGraphtUtilitiesはどこでも利用できますか?JGraphTでエキセントリックを生成するメソッドが表示されません。
Nick

回答:


205

メソッドassertEquals(Object、Object)は型...があいまいです...

このエラーが意味することは、2つの異なるシグネチャを持つメソッドにdoubleDoubleを渡すことです。オートボクシングのおかげでassertEquals(Object, Object)assertEquals(double, double)両方とも呼び出すことができます。

あいまいさを回避するには、assertEquals(Object, Object)(2つのDoubleを渡すことによって)またはassertEquals(double, double)(2つのDoubleを渡すことによって)を呼び出すようにしてください。

したがって、あなたのケースでは、あなたは使うべきです:

assertEquals(Double.valueOf(70), eccen.get("alpha"));

または:

assertEquals(70.0d, eccen.get("alpha").doubleValue());

OK、または単にJUnit 3の代わりにJUnit 4を使用するように切り替えることができます。どうすればよいですか?
ニックハイナー、

8
解決策は、あるバージョンから別のバージョンに切り替えることではありません。代わりに、コンパイラーを助けて、私が提案したようにあいまいさを取り除いてください。
Pascal Thivent 2009年

1
とにかく、それはassertEquals(70.0d、eccen.get( "alpha"));であってはなりません。?
マーラー2009年

3
JUnitのバージョンは両方を持っている場合@mahllerは確かにあなたはそれがまだあいまいな、それはOPのコードよりもより正確だ場合でも、に話したがされるわけではありません、誰assertEquals(Object, Object)assertEquals(double, double)JUnitの4.4、4.5の場合です。しかし、先ほど述べたように、JUnitのバージョンを変更することは実際の解決策ではなく、問題を修正するだけです。
Pascal Thivent 2009年

1
この特定の場合について@Rosarch、それはJUnitの3.8.1に問題ではない、それはJUnitを4.3に問題ではない、それはあるのJUnit 4.4の問題、それはある JUnitを4.5に問題(ただし方法撮影2 doublesは非推奨です)、JUnit 4.6では問題ではありません(メソッドは削除されました)。したがって、選択を行いますが、コードを修正する必要があります。
Pascal Thivent 2009年

1

あなたは方法を使うことができます

assertEquals(double expected, double actual, double delta)

これは、浮動小数点に近い丸め誤差を考慮に入れます(たとえば、この投稿を参照してください)。あなたは書ける

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

つまり、2つの値の差が0.0001未満である限り、それらは等しいと見なされます。これには2つの利点があります。

  • 浮動小数点値を想定どおりに比較します
  • 3つの引数assertはdoubleにのみ適用され、ジェネリックオブジェクトには適用されないため、キャストする必要はありません。

0

この問題の最も簡単な解決策は、2番目のパラメーターをプリミティブにキャストすることです。

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

あいまいさが削除されました。

これは、次のように、任意のNumberサブクラスに有効です。

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

あいまいさも解決します。

ただし、assertEquals(double、double)は現在、適切な理由で廃止されているため、他のユーザーがすでに提案しているように、デルタを使用してメソッドを使用することをお勧めします。

正当な理由により、倍精度数の内部表現が与えられた場合、2つの見かけ上等しい倍精度数は、無関係な微小部分で異なる可能性があり、テストに合格しませんが、コードに問題があることを意味するわけではありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.