2011-09-28 34 views
9

Tôi đang cố gắng tự dạy mình Mockito.Mockito "khi" vấn đề

Xem xét các phương pháp sau đây, hasInventory(), mà nên không thực sự chạy theo cách suy nghĩ của tôi, nhưng có được thiết lập để trở đúng hoặc sai như tôi lồng sóc thử nghiệm của tôi. Lớp Kho hàng là "phụ thuộc giả mạo" của tôi.

public class Warehouse implements IWarehouse 
{ 
    private Map< String, Integer > inventory; 

    public Warehouse() 
    { 
    this.inventory = new HashMap< String, Integer >(); 
    } 

    public final boolean hasInventory(String itemname, int quantity) 
     throws InventoryDoesNotExistException 
    { 
    if(inventory == null) 
     throw new InventoryDoesNotExistException(); 

    if(!inventory.containsKey(itemname)) 
     return false; 

    int current = (inventory.containsKey(itemname)) ? inventory.get(itemname) : 0; 

    return(current >= quantity); 
    } 
    ... 

Trong mã kiểm tra JUnit, là người đầu tiên khi() ném một ngoại lệ vì nó theo nghĩa đen giải thích các lời gọi phương thức (thực hiện nó) và, hàng tồn kho là con số không (xem ở trên), InventoryDoesNotExistException là ném. Cũng có các phương pháp khác trong lớp phụ thuộc giả lập, như thêm()xóa().

@RunWith(MockitoJUnitRunner.class) 
public class OrderInteractionTest 
{ 
    private static final String TALISKER = "Talisker"; 
    private Order systemUnderTest = null; 

    @Mock 
    private Warehouse mockedDependency = null; 

    @Before 
    public void init() 
    { 
    //MockitoAnnotations.initMocks(this); 
    //mockedDependency = mock(Warehouse.class); 
    this.systemUnderTest = new Order(TALISKER, 50); 
    } 

    @Test 
    public void testFillingRemovesInventoryIfInStock() 
    { 
    try 
    { 
     doNothing().doThrow(new RuntimeException()).when(mockedDependency).add(anyString(), anyInt()); 
     doNothing().doThrow(new RuntimeException()).when(mockedDependency).remove(anyString(), anyInt()); 
     when(mockedDependency.hasInventory(anyString(), anyInt())).thenReturn(true); 
     when(mockedDependency.getInventory(anyString())).thenReturn(50); 

Theo tôi được biết, do khi() phương pháp, tôi đang hỏi Mockito chính xác không gọi hasInventory(), nhưng chỉ để trở đúng thay vì bất cứ khi nào nó được gọi như tôi thử nghiệm lớp ("systemUnderTest"). Bất cứ ai có thể giúp tôi vượt qua thời điểm này (hoặc nhận được một số ý nghĩa vào bộ não của tôi)?

Tôi đang liên kết Mockito-all-1.8.5.jar và JUnit 4.

nhờ dồi dào cho tất cả người đọc.

Russ

Trả lời

10

Mockito không thể giả loại final các lớp hoặc phương pháp. Thử xóa công cụ sửa đổi final khỏi phương thức hasInventory. Hoặc tốt hơn, đừng chế nhạo lớp Warehouse, thay vào đó giả lập giao diện IWarehouse, có phương pháp không thể là final và có lẽ định nghĩa các phương thức được sử dụng bởi Order.

Nói chung, bạn nên sử dụng giao diện giả, nhưng không bắt buộc.

Không thể giả lập các lớp hoặc phương pháp final được đề cập ngắn gọn trong Mockito FAQ, đó là do kỹ thuật tạo lớp thời gian chạy được sử dụng để tạo mocks.

+0

Ha! Vâng, đó là vấn đề. Trong thực tế, tôi đã đọc điều gì đó về điều này sớm hơn, nhưng tôi đã không tạo ra kết nối. Để bắt chước các hướng dẫn khác, tôi đã bắt đầu giả lập IWarehouse và điều đó đang hoạt động, vì vậy tôi nghĩ rằng tôi chỉ có thể giả lập giao diện (tôi đã nói chuyện với ai đó một vài tuần trước, người đã nói với tôi rằng tôi có thể thử các lớp đơn giản, vì vậy tôi đã không cố gắng để giả lập giao diện kể từ khi tôi tìm thấy trong nhiều tình huống thực tế, tôi thậm chí sẽ không có giao diện). Nhưng đây là câu trả lời đúng! Cảm ơn bạn rất nhiều cho việc này. –

Các vấn đề liên quan