2013-06-03 12 views
18

私は単体テストを作成しようとしています。これを行うには、私はMockitoモックのためのwhen文を書いていますが、戻り値は有効です。Mockitoでクラスオブジェクトを返すことができません

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

.getParameterType()の戻り値の型がClass<?>ので、日食と言う私はなぜ、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 ?>)を理解していない:

は、ここで私がやっているものです。それは、私のuserClassをキャストすることを提供しますが、それはちょうどそれが再びキャストする必要があると(キャストすることはできません)、いくつかの文字化けしたものを作る。

これはEclipseの単なる問題ですか、それとも間違っていますか?

答えて

9

なぜこのエラーが発生するのかわかりません。 Class<?>を返すこととは特別な何かが必要です。 Classを返すとコードが正常にコンパイルされます。これはあなたがやっていることのシミュレーションで、このテストに合格します。これはあなたのためにもうまくいくと思います。

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

はい、eclipseやmockitoの問題であるようです。私はあなたの提案を実装することができた、それは問題を周ったので、ありがとう! – CorayThan

+0

@CorayThan Eclipseではありません。これはIntellijでもコンパイルされません。 –

+0

NetBeansにも同じです。 –

44

また、これを回避するもう少し簡潔な方法は、代わりにdo構文を使用することです。

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

素晴らしいヒント!これは受け入れられるべきです! –

+0

これは最もクリーンな解決策です。 – Scott

+0

恐ろしい...うん、きれいな解決策。どうもありがとう。 –

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

OngoingStubbing<Class<?>>Mockito.whenによって返されたが、各のでongoingStubbingと同じタイプではありません '?'ワイルドカードは別のタイプにバインドできます。

は、タイプが一致するようにするには、明示的に型パラメータを指定する必要があります。

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

部分: 'モッキート。 >がいつキーであったかを示します。答えをありがとう。 –

+0

私の意見では、明示的なタイピングを使うことは、現在投票されている「正しい」回答よりも洗練された解決策です –

1

が、私はここに最初に受け入れ答えの中で使用さmethodParameter.getParameterType()を使用して少し混乱のコード例を見つけましたSandBoxTest。私がもう少し掘り下げた後、私はより良い例を提供したanother thread pertaining to this issueを見つけました。この例では、私が必要としていたMockitoコールが、doReturn(myExpectedClass).when(myMock).callsMyMethod(withAnyParams)だったことを明確にしました。そのフォームを使用すると、私はクラスの復帰を模擬することができます。うまくいけば、このメモは、将来同様の問題を探している人を助けるでしょう。

関連する問題