2015-12-16 19 views
10

Xem xét các phương pháp sau đây:Làm thế nào để giả lập gọi phương thức và trả về giá trị mà không cần chạy phương thức?

public boolean isACertainValue() { 
     if(context.getValueA() != null && context.getValueA().toBoolean() == true) { 
     if(context.getType() != null && context.getType() == ContextType.certainType) { 
      return true; 
     } 
    } 
    return false; 
} 

tôi đã không viết mã này, nó là xấu xí như địa ngục, nó là hoàn toàn overcomplicated nhưng tôi phải làm việc với nó.

Bây giờ tôi muốn thử nghiệm một phương pháp dựa vào một cuộc gọi đến phương pháp này.

Tôi nghĩ tôi có thể đối phó với điều này bằng cách:

Mockito.when(spy.isACertainValue()).thenReturn(true); vì đó là trường hợp tôi muốn thử nghiệm.

Nhưng nó không hoạt động như nó vẫn đang kêu gọi các phương pháp thân:/

tôi nhận được nullpointers hay đúng hơn là tôi nhận được một cái gì đó dọc theo dòng của

misusing.WrongTypeOfReturnValue; Boolean không thể được trả về bởi getValueA(). getValueA() sẽ trả về ValueA

Vì vậy, tôi đã cố gắng (như là một cách giải quyết khác) để thực hiện:

Mockito.when(contextMock.getValueA()).thenReturn(new ValueA());Mockito.when(contextMock.getType()).thenReturn(ContextType.certainType);

nhưng sau đó tôi nhận được một nullpointer mà tôi không thể dường như có thể tìm lỗi.

Vì vậy, làm thế nào nó được thực hiện ngay trong trường hợp này?

+1

Đó chính xác là cách thực hiện, nhưng có thể có giá trị IN giá trị đó mà bạn cần thêm trong thử nghiệm của mình, vì vậy bạn cũng nên thử đối tượng được trả về chứ không phải trả lại một thể hiện được khởi tạo với một hàm tạo (mặc định). – Stultuske

Trả lời

13

Khi bạn đang gọi

Mockito.when(spy.isCertainValue()).thenReturn(true); 

phương pháp isCertainValue() là nhận được gọi ở đây. Đây là cách Java hoạt động: để đánh giá đối số của Mockito.when, kết quả của spy.isCertainValue() phải được đánh giá để phương thức phải được gọi.

Nếu bạn không muốn điều đó xảy ra, bạn có thể sử dụng the following construct:

Mockito.doReturn(true).when(spy).isCertainValue(); 

này sẽ có tác dụng mocking tương tự nhưng phương pháp này sẽ không được gọi với điều này.

+0

Cảm ơn bạn, tôi đang theo dõi nhiều hơn bây giờ ... Tôi nhận được một nullpointer tho xD Tôi ghét chương trình này rất nhiều, đó là một abomination: X – Sorona

+0

Liên kết bị hỏng. Bạn thiết lập gián điệp ở đâu? – powder366

+0

Nó làm việc cho tôi. Nó ngừng ném NPE. Cảm ơn Tunaki! – Dish

0

Mã này là đúng:

Mockito.when(contextMock.getType()).thenReturn(ContextType.certainType); 

Nhưng bạn đang nhận được NullPointerException vì bạn đã không xác định giá trị Mocking cần được định nghĩa, tôi cũng đang sử dụng Spring, trong tập tin bối cảnh của tôi khi tôi xác định @Autowired đậu Tôi xác định nó theo cách này:

<bean id="contextMock" class="org.mockito.Mockito" factory-method="mock"> 
    <constructor-arg value="com.example.myspringproject.bean.ContextMock" /> 
</bean> 
Các vấn đề liên quan