2010-11-19 23 views
84

Có cách nào ngắn gọn, tích hợp để thực hiện bằng các xác nhận trên hai mảng được đánh máy giống như trong JUnit không? Theo mặc định (ít nhất là trong JUnit 4) nó dường như làm một thể hiện so sánh trên chính đối tượng mảng đó.So sánh các mảng trong các xác nhận JUnit, được xây dựng theo cách súc tích?

EG, không hoạt động:

int[] expectedResult = new int[] { 116800, 116800 }; 
int[] result = new GraphixMask().sortedAreas(rectangles); 
assertEquals(expectedResult, result); 

Tất nhiên, tôi có thể làm điều đó bằng tay với:

assertEquals(expectedResult.length, result.length); 
for (int i = 0; i < expectedResult.length; i++) 
    assertEquals("mismatch at " + i, expectedResult[i], result[i]); 

..nhưng là có một cách tốt hơn?

Trả lời

175

phương pháp assertArrayEquals Sử dụng org.junit.Assert 's:

import org.junit.Assert; 
... 

Assert.assertArrayEquals(expectedResult, result); 

Nếu phương pháp này không có sẵn, bạn có thể đã vô tình nhập khẩu các lớp Khẳng định từ junit.framework.

30

Bạn có thể sử dụng Arrays.equals(..):

assertTrue(Arrays.equals(expectedResult, result)); 
+10

gì stinks về mặc dù đó là bạn nhận được NO dữ liệu về những gì đã xảy ra khi nó không thành công. – mBria

+7

Tốt đẹp khi bạn đang sử dụng phiên bản junit cũ hơn (như trên Android) – Zitrax

+0

Nếu bạn muốn xem các byte nào không phù hợp, bạn có thể chuyển đổi chúng thành chuỗi: assertEquals (Arrays.toString (expectedResult), Arrays.toString (result)) ; – Erdem

10
+1

Hm, tôi không thấy bất kỳ 'assertArrayEquals' nào trong 'junit.framework.Assert' của tôi? – mBria

+1

@mBria nâng cấp junit – Bozho

+0

4.8.1 của bạn là những gì tôi có, và những gì dường như là mới nhất có sẵn thông qua Maven (http://grepcode.com/search?query=junit+4.9&start=0&entity=type&n=). Chỉ có trong 4.8.2 hoặc 4.9? – mBria

2

Tôi biết câu hỏi là cho Junit4, nhưng nếu bạn tình cờ bị mắc kẹt tại JUnit3, bạn có thể tạo một hàm tiện ích ngắn như thế:

private void assertArrayEquals(Object[] esperado, Object[] real) { 
    assertEquals(Arrays.asList(esperado), Arrays.asList(real));  
} 

Trong JUnit3, đây là tốt hơn so với so sánh trực tiếp các mảng , vì nó sẽ chi tiết chính xác yếu tố nào khác nhau.

8

tôi thích để chuyển đổi mảng các chuỗi:

Assert.assertEquals(
       Arrays.toString(values), 
       Arrays.toString(new int[] { 7, 8, 9, 3 })); 

cách này, tôi có thể thấy rõ nơi các giá trị sai là. Điều này hoạt động hiệu quả chỉ cho các mảng có kích thước nhỏ, nhưng tôi hiếm khi sử dụng mảng với nhiều mục hơn 7 trong các bài kiểm tra đơn vị của tôi.

Phương pháp này hoạt động cho các loại nguyên thủy và các loại khác khi quá tải toString trả về tất cả thông tin cần thiết.

0

Sử dụng junit4 và Hamcrest bạn nhận được phương pháp súc tích so sánh các mảng. Nó cũng cung cấp thông tin chi tiết về lỗi trong dấu vết lỗi.

import static org.junit.Assert.* 
import static org.hamcrest.CoreMatchers.*; 

//... 

assertThat(result, is(new int[] {56, 100, 2000})); 

Không Dấu vết đầu ra:

java.lang.AssertionError: 
    Expected: is [<56>, <100>, <2000>] 
    but: was [<55>, <100>, <2000>] 
Các vấn đề liên quan