2014-04-23 15 views
18

Tôi có lớp học A cần thử nghiệm. Sau đây là định nghĩa của A:Sử dụng Mockito để mô phỏng biến cục bộ của phương thức

public class A { 
    public void methodOne(int argument) { 
     //some operations 
     methodTwo(int argument); 
     //some operations 
    } 

    private void methodTwo(int argument) { 
     DateTime dateTime = new DateTime(); 
     //use dateTime to perform some operations 
    } 
} 

Và dựa trên giá trị dateTime một số dữ liệu là để được thao tác, lấy ra từ cơ sở dữ liệu. Đối với cơ sở dữ liệu này, các giá trị được duy trì thông qua một tệp JSON.

Điều này làm phức tạp mọi thứ. Những gì tôi cần là đặt dateTime cho một số ngày cụ thể trong khi nó đang được thử nghiệm. Có cách nào tôi có thể giả định một giá trị của biến địa phương bằng cách sử dụng mockito?

+0

bản sao có thể có của [Phương pháp chế nhạo đối tượng phạm vi cục bộ với Mockito] (http://stackoverflow.com/questions/6520242/mocking-methods-of-local-scope-objects-with-mockito) – zubergu

+0

Không có mục nào khác câu hỏi mà tôi tìm thấy về chủ đề này có lớp trừu tượng thêm. Hơn nữa, phần lớn trong số họ đã khởi tạo biến cục bộ thông qua một số phương thức của lớp giả. – user657592

Trả lời

18

Bạn không thể giả lập biến cục bộ. Những gì bạn có thể làm, tuy nhiên, là trích xuất sáng tạo của nó đến một phương pháp protectedspy nó:

public class A { 
    public void methodOne(int argument) { 
    //some operations 
    methodTwo(int argument); 
    //some operations 
    } 

    private void methodTwo(int argument) { 
    DateTime dateTime = createDateTime(); 
    //use dateTime to perform some operations 
    } 

    protected DateTime createDateTime() { 
    return new DateTime(); 
    } 
} 

public class ATest { 
    @Test 
    public void testMethodOne() { 
    DateTime dt = new DateTime (/* some known parameters... */); 
    A a = Mockito.spy(new A()); 
    doReturn(dt).when(a).createDateTime(); 
    int arg = 0; // Or some meaningful value... 
    a.methodOne(arg); 
    // assert the result 
} 
+6

Tôi không muốn viết phương thức createDateTime() được bảo vệ. Không có cách nào khác để đi về nó? – user657592

+0

Thực ra bạn phải sử dụng Mockito.doReturn (dt) .when (a) .createDateTime() Vui lòng xem https://stackoverflow.com/questions/11620103/mockito-trying-to-spy-on-method-is-calling -the-original-method – Alex

+1

Đây là khóa học chính xác @ Alex, cảm ơn vì đã chú ý! Đã chỉnh sửa và sửa. – Mureinik

2

Cách tốt nhất để đối phó với một vấn đề như vậy là để sử dụng một tiêm Clock dịch vụ, được sử dụng để có được các trường hợp mới của DateTime . Bằng cách đó, kiểm tra của bạn có thể tiêm một đồng hồ giả, trả về một DateTime cụ thể thay vì thời gian hiện tại.

Lưu ý rằng API thời gian 8 Java mới định nghĩa một Clock class, cụ thể cho mục đích đó.

+0

Điều này yêu cầu một jdk1.8, phải không? Tôi hiện đang trên 1,7 và không có kế hoạch nâng cấp sớm. – user657592

+1

Không. Bạn chỉ cần định nghĩa lớp Đồng hồ hoặc giao diện của riêng bạn và gọi 'clock.newDateTime()' thay vì 'new DateTime()' để lấy thời gian hiện tại. –

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