Java JUnit: X yöntemi, Y türü için belirsizdir


98

İyi çalışan bazı testlerim vardı. Sonra onu farklı bir pakete taşıdım ve şimdi hata alıyorum. İşte kod:

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

Hata mesajı şudur:

Yöntemi assertEquals (Object, Object) JGraphtUtilitiesTest türü için belirsizdir

Bunu nasıl düzeltebilirim? Sınıfı farklı bir pakete taşıdığımda bu sorun neden ortaya çıktı?


bize sınıfınızın nasıl ilan edildiğini söyleyin. Bana, JUnit3'ten miras almış ve sonra JUnit4'ten statik olarak içe aktarmayı denemişsiniz gibi görünüyor.
bmargulies

evet, aslında, A paketinde JUnit3 vardı ve orijinal olarak bu testleri yazdığım B paketinde JUnit4 kullandım. Sonra Paket B'den Paket A'ya geçtim ve sorun ortaya çıktı. Ama bu sınıfta JUnit 3'ü gösterecek hiçbir şey görmüyorum. Bu nerede ilan edilir?
Nick Heiner

@Rosarch Bu JGraphtUtilities her yerde mevcut mu? JGraphT'ta eksantriklik üretme yöntemlerini göremiyorum!
Nick

Yanıtlar:


205

Yöntem assertEquals (Object, Object) türü için belirsizdir ...

Bu hatanın anlamı, bir doubleve ve Doubleiki farklı imzası olan bir yönteme geçmenizdir : assertEquals(Object, Object)ve assertEquals(double, double)otomatik kutulama sayesinde her ikisi de çağrılabilir.

Belirsizlikten kaçınmak için ya çağırdığınızdan assertEquals(Object, Object)(iki Çift geçerek) ya da assertEquals(double, double)(iki çift geçerek ) emin olun .

Yani, sizin durumunuzda şunları kullanmalısınız:

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

Veya:

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

tamam, yoksa onu JUnit 3 yerine JUnit 4 kullanacak şekilde değiştirebilirim. Bunu nasıl yapabilirim?
Nick Heiner

8
Çözüm gerçekten bir sürümden diğerine geçmek değildir. Bunun yerine, derleyiciye yardım edin ve önerdiğim gibi belirsizliği kaldırın.
Pascal Thivent

1
Her neyse, assertEquals (70.0d, eccen.get ("alpha")) olmamalı; ?
mhaller

3
@mahller emin değil misiniz o OP'ın kodundan daha doğru olsa bile, konuşurken ama kim, hala JUnit sürümü belirsiz hem sahipse assertEquals(Object, Object)ve assertEquals(double, double)JUnit 4.4, 4.5 davası hangi. Ama dediğim gibi, JUnit'in sürümünü değiştirmek gerçek çözüm değil, sadece sorunu çöz.
Pascal Thivent

1
Bu JUnit 4.3 bir sorun değildir bu JUnit 3.8.1 bir sorun değildir, bu özel durum için @Rosarch, bu ise JUnit 4.4 sorunun, bu ise bir JUnit 4,5 problem (ama yöntem 2 alarak çiftler kullanımdan kaldırılmıştır), JUnit 4.6'da bir sorun değildir (yöntem kaldırılmıştır). Öyleyse seçiminizi yapın, ancak kodu düzeltmelisiniz.
Pascal Thivent

1

Yöntemi kullanabilirsiniz

assertEquals(double expected, double actual, double delta)

Kayan noktaya hinerent olan yuvarlama hatasını hesaba katacak ( örneğin bu yazıya bakın ). Yazabilirsin

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

Bu, iki değerin 0.0001'den daha az farklılık gösterdiği sürece eşit kabul edileceği anlamına gelir. Bunun iki avantajı vardır:

  • Kayan nokta değerlerini olması gerektiği gibi karşılaştırır
  • Üç argümanın öne sürdüğü gibi, jenerik Nesneler için değil, yalnızca çiftler için geçerli olduğu için dönüştürme yapmaya gerek yok

0

Bu sorunun en basit çözümü, ikinci parametreyi ilkel hale getirmektir:

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

Belirsizlik kaldırıldı.

Bu, Number alt sınıflarından herhangi biri için geçerlidir, örneğin:

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

Bir belirsizliği de çözer.

Bununla birlikte, assertEquals (double, double) şu anda ve iyi nedenlerle kullanımdan kaldırılmıştır, bu nedenle yöntemi başkalarının önerdiği gibi bir delta ile kullanmanızı tavsiye ederim.

İyi nedenlerle, çift sayıların iç temsili göz önüne alındığında, görünüşte eşit olan iki çift sayının alakasız sonsuz küçük bir kesirde farklılık gösterebileceğini ve bir testi geçemeyeceğini kastediyorum, ancak bu, kodunuzda bir sorun olduğu anlamına gelmez.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.