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

네, 사실 저는 패키지 A에 JUnit3를 가지고 있었고 원래이 테스트를 작성한 패키지 B에 JUnit4를 사용했습니다. 그런 다음 패키지 B에서 패키지 A로 전환했는데 문제가 발생했습니다. 하지만이 클래스에서 JUnit 3을 나타내는 것은 보이지 않습니다. 선언 된 위치는 어디입니까?
Nick Heiner

@Rosarch이 JGraphtUtilities는 어디서나 사용할 수 있습니까? JGraphT에서 편심을 생성하는 방법을 볼 수 없습니다!
Nick

답변:


205

assertEquals (Object, Object) 메소드는 ... 유형에 대해 모호합니다.

어떤이 오류가 의미하는 것은 당신이 전달하는 것입니다 double및과 Double: 두 개의 서로 다른 서명을이 방법으로 assertEquals(Object, Object)하고 assertEquals(double, double)모두, 오토 박싱 덕분이라고 할 수있다.

모호함을 피하기 위해 assertEquals(Object, Object)(두 번의 복식 통과) 또는 assertEquals(double, double)( 두 번의 복식 통과) 를 호출해야합니다 .

따라서 귀하의 경우에는 다음을 사용해야합니다.

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

또는:

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

좋아요, 아니면 JUnit 3 대신 JUnit 4를 사용하도록 전환 할 수 있습니다. 어떻게해야합니까?
Nick Heiner

8
해결책은 실제로 한 버전에서 다른 버전으로 전환하는 것이 아닙니다. 대신 컴파일러를 돕고 내가 제안한 모호함을 제거하십시오.
Pascal Thivent

1
어쨌든 assertEquals (70.0d, eccen.get ( "alpha")); ?
mhaller

3
@mahller 누구와 이야기하고 있는지 확실하지 않지만 OP의 코드보다 더 정확하더라도 JUnit 버전 에 JUnit 4.4, 4.5의 경우 둘 다 포함 assertEquals(Object, Object)되어 있는지는 여전히 모호합니다 assertEquals(double, double). 그러나 내가 말했듯이 JUnit의 버전을 변경하는 것은 실제 해결책이 아니며 문제를 해결하십시오.
Pascal Thivent

1
그것은 JUnit을 4.3에서 문제가되지는 JUnit을 3.8.1에서 문제없고, 특히이 경우 들어 @Rosarch 그것은 이다 의 JUnit 4.4의 문제는 있다 JUnit가 4.5 문제 (그러나 방법 2 복용 doubles는 더 이상 사용되지 않음) JUnit 4.6에서는 문제가되지 않습니다 (메소드가 제거됨). 따라서 선택하되 코드를 수정해야합니다.
Pascal Thivent

1

방법을 사용할 수 있습니다

assertEquals(double expected, double actual, double delta)

부동 소수점에 대한 반올림 오류를 고려합니다 ( 예를 들어이 게시물 참조 ). 당신은 쓸 수 있습니다

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

이는 두 값이 0.0001 미만으로 다른 한 동일한 것으로 간주됨을 의미합니다. 여기에는 두 가지 장점이 있습니다.

  • 예상대로 부동 소수점 값을 비교합니다.
  • 세 가지 인수 주장은 일반 객체가 아닌 복식에만 적용되므로 캐스팅 할 필요가 없습니다.

0

이 문제에 대한 가장 간단한 해결책은 두 번째 매개 변수를 기본으로 캐스트하는 것입니다.

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

모호성이 제거되었습니다.

다음과 같이 Number 하위 클래스에 유효합니다.

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

모호함도 해결할 것입니다.

그러나 assertEquals (double, double)는 현재와 정당한 이유로 더 이상 사용되지 않으므로 다른 사람들이 이미 제안한대로 델타와 함께 메서드를 사용하는 것이 좋습니다.

타당한 이유는 이중 숫자의 내부 표현을 고려할 때 두 개의 동일한 이중 숫자가 관련이없는 극소 분수에서 다를 수 있으며 테스트를 통과하지 못할 수 있지만 이것이 코드에 문제가 있다는 것을 의미하지는 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.