2013-09-25 79 views
8

Trong trường hợp thử nghiệm của tôi, tôi nhận được một giá trị số nguyên:Junit assert HOẶC điều kiện trong trường hợp của tôi

int val = getXXX(); 

Sau đó, tôi muốn kiểm tra xem val hoặc tương đương với 3 hoặc tương đương với 5 tương đương là ok trong cả hai trường hợp. Vì vậy, tôi đã làm:

assertTrue(val == 3 || val==5); 

tôi chạy thử nghiệm của tôi, nhật ký cho thấy val là 5, nhưng mã khẳng định trên của tôi thất bại với AssertionFailedError. Dường như tôi không thể sử dụng assertTrue(...) theo cách này, sau đó, làm thế nào để kiểm tra đúng cho điều kiện OR?

+2

gỡ lỗi thử nghiệm của bạn và kiểm tra giá trị của 'val' ngay trước khi tuyên bố rằng' assertTrue'. Vẫn còn 5? – chrylis

Trả lời

7

ive đã cố gắng để viết test nhanh:

@Test 
public void testName() { 
    int i = 5; 
    junit.framework.Assert.assertTrue(i == 3 || i == 5); 

} 

qua nó luôn vì vậy tôi đoán có một số mã Inbetween khi giá trị của bạn bị thay đổi. Bạn có thể sử dụng

org.junit.Assert.assertEquals(5, i); 

để kiểm tra giá trị - khẳng định này sẽ in ra thông tin thoải mái whats sai, ví dụ:

java.lang.AssertionError: 
Expected :4 
Actual :5 
23

Bạn có thể sử dụng Hamcrest matchers để có được một thông báo lỗi rõ ràng hơn ở đây:

int i = 2; 
assertThat(i, Matchers.either(Matchers.is(3)).or(Matchers.is(5)) 

or 

int i = 2; 
assertThat(i, Matchers.anyOf(Matchers.is(3),Matchers.is(5))); 

Điều này sẽ giải thích rõ ràng hơn:

Expected: (is <3> or is <5>) 
    but: was <2> 

hiển thị chính xác kỳ vọng và giá trị không chính xác đã được cung cấp.

+0

Để làm việc này phải bao gồm một sự phụ thuộc vào thư viện hamcrest. JUnit chỉ phụ thuộc vào lõi hamcrest, không bao gồm lớp Matchers. – toongeorges

2

Trong khi đối sánh Harmcrest có thể thực hiện công việc, các hằng số này có thể dễ dàng được cấu trúc lại thành hằng số trung bình hơn, như danh sách các giá trị hợp lệ. Sau đó, bạn có thể sử dụng phương pháp contains để kiểm tra xem giá trị có mặt trong danh sách - IMO cũng là dễ dàng hơn để đọc:

public class Foo { 
    public static final List<Integer> VALID_VALUES = Arrays.asList(3, 5); 
} 

@Test 
public void testName() { 
    int i = 5; 
    Assert.assertTrue(Foo.VALID_VALUES.contains(i)); 
} 
+0

Bạn sẽ cần phải xác định một hằng số cho mỗi trường hợp thử nghiệm; Tôi không nghĩ rằng điều này là hợp lý ngoài một vài trường hợp thử nghiệm. Những hằng số này có thể sẽ cách xa nơi chúng được sử dụng. Một vấn đề dễ đọc khác: 'Foo.VALID_VALUES.contains (i)' là ít rõ ràng hơn so với cách tiếp cận với Harmcrest matchers. Harmcrest cũng cung cấp một matcher với chứa, mà cũng sẽ tốt hơn nhiều so với điều này. – garci560