2017-07-20 34 views
5

Tại sao mockMap sử dụng triển khai thực sự? Làm cách nào để ngăn chặn điều này?Đối tượng giả Mockito sử dụng thực hiện thực tế

Trong phương pháp testFirstKeyMatch

when(mockMap.keySet().toArray()[0])... 

ném ArrayIndexOutOfBoundsException: 0 khi chạy thử nghiệm.

MaxSizeHashMap là LinkedHashMap có kích thước tối đa là 7, ném ra một IndexOutOfBoundsException khi tôi cố gắng thêm vào.

Tiểu sử theo dõi thứ gì đó không cần thiết cho việc này.

SuperClass.java

public class SuperClass { 

protected String[] days; 
protected MaxSizeHashMap<String, String> map; 

public SuperClass() { 
    days = new String[7]; 
    map = new MaxSizeHashMap<String, String>(); 
    //... 
} 

void updateDays() { 

    cal = Calendar.getInstance(); 

    for (int i = 0; i < 7; i = i + 1) { 

     //adds short names "Mon", "Tue", ... to days 
     days[i] = cal.getDisplayName(Calendar.DAY_OF_WEEK, 
       Calendar.SHORT, Locale.US); 

     cal.add(Calendar.DATE, 1); 
    } 
} 

void firstKeyMatch(Profile profile) { 

    updateDays(); 

    //checks if first key of map is not same as days[0] 
    if (days[0] != map.keySet().toArray()[0]) { 

     profile.add(); 

     //... 
    } 
} 
} 

SuperClassTest.java

@RunWith(MockitoJUnitRunner.class) 
public class SuperClassTest { 

@InjectMocks 
private SuperClass spr = new SuperClass(); 

@Mock 
private MaxSizeHashMap<String, String> mockMap; 

@Mock 
private Profile mockProfile; 

//... 

@Test 
public void testFirstKeyMatch() { 

    when(mockMap.keySet().toArray()[0]).thenReturn(spr.days[0]); 

    verify(mockProfile, never()).add(); 

} 
} 
+1

Hãy thử này 'khi (mockMap.keySet()). thenReturn (new HashSet (Arrays.asList ("chuỗi ngày của bạn"))); 'bằng cách thay thế" chuỗi ngày của bạn "với bất kỳ giá trị nào bạn đang thử nghiệm với – Abubakkar

+1

Nó không phải là thực hiện thực, mocks trả về giá trị mặc định. Trong trường hợp 'keySet()', nó là một tập hợp rỗng. – Jonathan

Trả lời

3

Theo documentation, hành vi tiềm ẩn Mockito cho một mô hình là để trở default values.

Theo mặc định, đối với tất cả các phương thức trả về giá trị, mô hình sẽ trả lại giá trị rỗng, giá trị trình bao nguyên thủy/nguyên thủy hoặc bộ sưu tập trống nếu thích hợp. Ví dụ 0 cho một int/Integer và false cho một boolean/Boolean.

Do đó, mockMap.keySet() sẽ trả về bộ băm rỗng, sau đó bạn chuyển đổi thành một mảng trống và cố truy xuất phần tử đầu tiên (không tồn tại), do đó IOOBE.

debugger

Tóm lại, Mockito không sử dụng việc thực hiện thực, nhưng nó cư xử bình thường như nó phải.

Bạn không đăng toàn bộ hàm tạo của SuperClass, nhưng có thể sau khi bạn khởi tạo bản đồ, bạn cũng điền nó với các giá trị. Nếu đó là sự thật, thì người ta có thể lập luận rằng ngoại lệ thực sự là bằng chứng rằng mockito không sử dụng việc thực hiện thực sự, bởi vì bạn thực sự sẽ nhận được phần tử đầu tiên.

Đối với các giải pháp, cũng nó đã được đề nghị trở lại băm của riêng bạn thiết lập với bất kỳ dữ liệu bạn yêu cầu (các khoản tín dụng đi đến Abubakkar):

when(mockMap.keySet()).thenReturn(new HashSet(Arrays.asList("your day string"))); 
1

Để chuyển hướng tất cả các cuộc gọi đến mockMap.keySet().toArray()[i]spr.days[i], bạn có thể nói mockMap để trả lại mảng days khi ai đó yêu cầu các thiết lập quan trọng.

Set keySetMock = mock(Set.class); 
when(keySetMock.toArray()).thenReturn(spr.days); 
when(mockMap.keySet()).thenReturn(keySetMock); 
Các vấn đề liên quan