2009-11-28 26 views
71

Tôi đã có một số thử nghiệm hoạt động tốt. Sau đó, tôi chuyển nó đến một gói khác, và bây giờ nhận được lỗi. Đây là mã:Java JUnit: Phương pháp X không rõ ràng đối với loại Y

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

Các thông báo lỗi là thế này:

Các assertEquals phương pháp (Object, Object) là mơ hồ đối với loại JGraphtUtilitiesTest

Làm thế nào tôi có thể sửa lỗi này? Tại sao vấn đề này xảy ra khi tôi chuyển lớp học sang một gói khác?

+0

cho chúng tôi biết lớp học của bạn được khai báo. Có vẻ như tôi đã thừa kế từ JUnit3 và sau đó cố gắng nhập tĩnh từ JUnit4. – bmargulies

+0

vâng, trên thực tế, tôi đã có JUnit3 trong gói A và sử dụng JUnit4 trong gói B, nơi tôi đã viết các bài kiểm tra ban đầu này. Sau đó tôi chuyển từ Gói B sang Gói A, và vấn đề nảy sinh. Nhưng tôi không thấy bất cứ điều gì trong lớp học này sẽ chỉ ra JUnit 3. Điều đó được tuyên bố ở đâu? –

+0

@Rosarch Các JGraphtUtilities này có sẵn ở bất kỳ đâu không? Tôi không thể nhìn thấy các phương pháp để tạo ra lập dị trong JGraphT! – Nick

Trả lời

171

Các assertEquals phương pháp (Object, Object) không rõ ràng cho các loại ...

gì lỗi này có nghĩa là bạn đang đi qua một double và và Double vào một phương pháp mà có hai chữ ký khác nhau: assertEquals(Object, Object)assertEquals(double, double) cả hai đều có thể được gọi, nhờ hộp số tự động.

Để tránh sự mơ hồ, hãy đảm bảo rằng bạn gọi số assertEquals(Object, Object) (bằng cách chuyển hai đôi) hoặc assertEquals(double, double) (bằng cách chuyển hai số tăng gấp đôi).

Vì vậy, trong trường hợp của bạn, bạn nên sử dụng:

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

Hoặc:

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

ok, hoặc tôi chỉ có thể chuyển đổi nó để sử dụng JUnit 4 thay vì JUnit 3. Làm thế nào để làm điều đó? –

+7

Giải pháp không thực sự chuyển từ phiên bản này sang phiên bản khác. Thay vào đó, hãy giúp trình biên dịch và loại bỏ sự mơ hồ như tôi đã đề xuất. –

+1

Dù sao, nó không phải là assertEquals (70.0d, eccen.get ("alpha")); ? – mhaller

0

Bạn có thể sử dụng phương pháp

assertEquals(double expected, double actual, double delta) 

nào sẽ đưa vào báo lỗi tài khoản làm tròn đó là hinerent để nổi điểm (xem this post ví dụ). Bạn có thể viết

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

Điều này có nghĩa là miễn là hai giá trị khác nhau nhỏ hơn 0,0001 thì chúng được coi là bằng. Điều này có hai ưu điểm:

  • So sánh các giá trị dấu chấm động khi họ có nghĩa vụ phải
  • Không cần phải cast, như khẳng định ba lập luận chỉ applyes để đôi, không để các đối tượng chung chung
Các vấn đề liên quan