2013-06-03 12 views
18

Tôi đang cố gắng viết một bài kiểm tra đơn vị, và để làm điều đó, tôi viết một tuyên bố khi cho một mô hình Mockito, nhưng tôi dường như không nhận được nhật thực để nhận ra rằng giá trị trả lại là hợp lệ.Không thể trả về đối tượng lớp với Mockito

Đây là những gì tôi đang làm:

Class<?> userClass = User.class; 
when(methodParameter.getParameterType()).thenReturn(userClass); 

Kiểu trả về của .getParameterType()Class<?>, vì vậy tôi không hiểu tại sao nhật thực nói, The method thenReturn(Class<capture#1-of ?>) in the type OngoingStubbing<Class<capture#1-of ?>> is not applicable for the arguments (Class<capture#2-of ?>). Nó cung cấp để cast userClass của tôi, nhưng điều đó chỉ làm cho một số công cụ bị cắt xén eclipse nói rằng nó cần phải cast một lần nữa (và không thể cast).

Đây có phải chỉ là vấn đề với Eclipse hay tôi đang làm điều gì sai?

Trả lời

9

Tôi không chắc chắn lý do bạn nhận được lỗi này. Nó phải có một cái gì đó đặc biệt để làm với trở về Class<?>. Mã của bạn biên dịch tốt nếu bạn trả về Class. Đây là một mô phỏng về những gì bạn đang làm và thử nghiệm này vượt qua. Tôi nghĩ rằng điều này sẽ làm việc cho bạn, quá:

package com.sandbox; 

import org.junit.Test; 
import org.mockito.invocation.InvocationOnMock; 
import org.mockito.stubbing.Answer; 

import static org.mockito.Mockito.*; 

import static junit.framework.Assert.assertEquals; 

public class SandboxTest { 

    @Test 
    public void testQuestionInput() { 
     SandboxTest methodParameter = mock(SandboxTest.class); 
     final Class<?> userClass = String.class; 
     when(methodParameter.getParameterType()).thenAnswer(new Answer<Object>() { 
      @Override 
      public Object answer(InvocationOnMock invocationOnMock) throws Throwable { 
       return userClass; 
      } 
     }); 

     assertEquals(String.class, methodParameter.getParameterType()); 
    } 

    public Class<?> getParameterType() { 
     return null; 
    } 


} 
+0

Có, có vẻ như nó phải là một vấn đề với nhật thực hoặc mockito. Tôi đã có thể thực hiện đề xuất của bạn, và điều đó xung quanh vấn đề, vì vậy cảm ơn! – CorayThan

+0

@CorayThan Nó không phải Eclipse. Điều này cũng không biên dịch trong Intellij. –

+0

Tương tự trong NetBeans. –

44

Ngoài ra, một cách hơi ngắn gọn hơn để làm được việc này là sử dụng cú pháp làm thay vì lúc nào.

doReturn(User.class).when(methodParameter).getParameterType(); 
+1

Mẹo hay! Điều này nên được chấp nhận! –

+0

Đây là giải pháp sạch nhất. – Scott

+0

Tuyệt vời ... yup, giải pháp sạch nhất. Cảm ơn nhiều. –

22
Class<?> userClass = User.class; 
OngoingStubbing<Class<?>> ongoingStubbing = Mockito.when(methodParameter.getParameterType()); 
ongoingStubbing.thenReturn(userClass); 

Các OngoingStubbing<Class<?>> trả về bởi Mockito.when không phải là loại giống như ongoingStubbing vì mỗi '?' ký tự đại diện có thể bị ràng buộc với một loại khác.

Để thực hiện các trận đấu loại, bạn cần phải xác định các tham số loại một cách rõ ràng:

Class<?> userClass = User.class; 
Mockito.<Class<?>>when(methodParameter.getParameterType()).thenReturn(userClass); 
+0

Phần: 'Mockito. > khi nào là chìa khóa. Cảm ơn câu trả lời. –

+0

Theo ý kiến ​​của tôi bằng cách sử dụng gõ rõ ràng là một giải pháp thanh lịch hơn so với câu trả lời 'chính xác' được bầu chọn hiện tại –

1

tôi thấy các ví dụ mã ở đây một chút bối rối với việc sử dụng methodParameter.getParameterType() đầu tiên được sử dụng trong các câu trả lời chấp nhận của SandBoxTest. Sau khi tôi tìm hiểu thêm một chút, tôi đã tìm thấy another thread pertaining to this issue đã cung cấp ví dụ tốt hơn. Ví dụ này làm cho nó rõ ràng các cuộc gọi Mockito tôi đã cần là doReturn (myExpectedClass) .when (myMock) .callsMyMethod (withAnyParams). Sử dụng biểu mẫu đó cho phép tôi giả lập một lớp học. Hy vọng rằng ghi chú này sẽ giúp ai đó tìm kiếm một vấn đề tương tự trong tương lai.