Pergunta

Eu tive alguns testes funcionando bem. Em seguida, mudei-me para um pacote diferente, e agora estou recebendo erros. Aqui está o código:

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

A mensagem de erro é o seguinte:

Os assertEquals método (Object, Object) é ambígua para o tipo JGraphtUtilitiesTest

Como posso corrigir isso? Por que este problema ocorrer enquanto eu movia a classe para um pacote diferente?

Foi útil?

Solução

Os assertEquals método (Object, Object) é ambígua para o tipo ...

O que significa este erro é que você está passando um double e e Double em um método que tem duas assinaturas diferentes: assertEquals(Object, Object) e assertEquals(double, double) ambos os quais poderiam ser chamados, graças ao autoboxing.

Para evitar a ambiguidade, certifique-se que você quer chamada assertEquals(Object, Object) (passando duas duplas) ou assertEquals(double, double) (passando duas duplas).

Assim, no seu caso, você deve usar:

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

Ou:

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

Outras dicas

Você pode usar o método

assertEquals(double expected, double actual, double delta)

O que levará em conta erro de arredondamento que são hinerent de ponto flutuante (ver este post por exemplo). Você pode escrever

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

Isso significa que, desde que os dois valores diferem por menos de 0,0001 eles são considerados iguais. Isso tem duas vantagens:

  • compara valores de ponto flutuante como eles são supostos
  • Não há necessidade de elenco, como o assert três argumento só applyes de duplas, não a objetos genéricos

A solução mais simples para este problema é apenas lançar o segundo parâmetro em um primitivo:

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

A ambigüidade removidos.

Isto é válido para qualquer das subclasses número, por exemplo:

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

iria resolver uma ambigüidade também.

No entanto, assertEquals (double, double) está obsoleto a partir de agora e por boas razões, então eu encorajá-lo a usar o método com um delta como outros sugeriram já.

Por boas razões, quero dizer que, dada a representação interna de números de duplas, dois números de dois aparentemente iguais podem diferir em uma fração infinitesimal irrelevante e não iria passar por um teste, mas isso não significa que haja algo de errado com o seu código.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top