testing - Java JUnit:메서드 X가 Y 유형에 대해 모호합니다.




compiler-errors package (4)

이 문제에 대한 가장 간단한 해결책은 두 번째 매개 변수를 프리미티브로 캐스팅하는 것입니다.

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

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

이것은 Number 서브 클래스 중 하나에 대해 유효합니다. 예를 들면 다음과 같습니다.

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

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

그러나, assertEquals (double, double)는 현재로서는 더 이상 사용되지 않으므로, 다른 사람들이 이미 제안한 것처럼 델타를 사용하는 것이 좋습니다.

합리적인 이유는 두 개의 숫자가 내부적으로 표현 되었기 때문에 두 개의 명백하게 동일한 두 개의 숫자가 무한한 무분별한 부분에서 다를 수 있으며 테스트를 통과하지 못한다는 의미입니다.하지만 이는 코드에 문제가 있음을 의미하지는 않습니다.

나는 잘 작동하는 몇 가지 테스트를했다. 그런 다음 다른 패키지로 옮겨서 오류가 발생했습니다. 다음은 코드입니다.

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(double expected, double actual, double delta)

부동 소수점으로 반올림하는 반올림 오류를 고려해야합니다 (예 : 이 게시물 참조). 당신은 쓸 수 있습니다

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

즉, 두 값이 0.0001 미만으로 다른 한 동일한 값으로 간주됩니다. 여기에는 두 가지 이점이 있습니다.

  • 부동 소수점 값을 예상 한대로 비교합니다.
  • 3 개의 인수는 복소수에만 적용되고 일반 객체에는 적용되지 않으므로 캐스트 할 필요가 없습니다.

assertEquals (Object, Object) 메서드는 해당 형식에 대해 모호합니다.

이 오류가 의미하는 것은 autoboxing 덕분에 assertEquals(Object, Object)assertEquals(double, double) 두 가지 서명이있는 메서드에 doubleDouble 을 전달한다는 것입니다.

모호성을 피하려면 assertEquals(Object, Object) (두 개의 Doubles를 전달) 또는 assertEquals(double, double) 호출해야합니다 assertEquals(double, double) 개의 double을 전달).

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

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

또는:

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

다른 응답자들과 마찬가지로, 나는 확실히 내부 루프를 다른 방법으로 넣는 것을 선호 합니다. 이 대답은 질문의 요구 사항이 어떻게 충족 될 수 있는지 보여줍니다.

바깥 쪽 루프의 레이블에 break 를 사용할 수 있습니다. 예 :

public class Test {
    public static void main(String[] args) {
        outerloop:
        for (int i=0; i < 5; i++) {
            for (int j=0; j < 5; j++) {
                if (i * j > 6) {
                    System.out.println("Breaking");
                    break outerloop;
                }
                System.out.println(i + " " + j);
            }
        }
        System.out.println("Done");
    }
}

인쇄 내용 :

0 0
0 1
0 2
0 3
0 4
1 0
1 1
1 2
1 3
1 4
2 0
2 1
2 2
2 3
Breaking
Done






java testing junit compiler-errors package