2013-06-03 17 views
18

Bir birim testi yazmaya çalışıyorum ve bunu yapmak için bir Mockito alayında bir zaman ifadesi yazıyorum, ancak bunu benim algılamak için tutulma alıp alamıyorum. dönüş değeri geçerlidir.Mockito ile Sınıf Nesnesi döndürülemiyor

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

.getParameterType() dönüş tipi Class<?>, bu nedenle tutulma diyor neden, 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 ?>) anlamıyorum:

İşte yapıyorum. UserClass'ımı yayınlamayı teklif ediyor, ancak bu sadece bazı karışık şeyler tutkunluğunun tekrar basması gerektiğini söylüyor (ve yapamaz).

Bu sadece Eclipse ile ilgili bir sorun mu, yoksa yanlış bir şey mi yapıyorum?

cevap

9

Neden bu hatayı aldığınızdan emin değilim. Class<?> ile dönen özel bir şey olmalı. Class'u döndürürseniz kodunuz iyi derlenir. Bu yaptığınız şeyin bir simülasyonudur ve bu test geçer. Bunun senin için de çalışacağını düşünüyorum:

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

Evet, eclipse veya mockito ile ilgili bir sorun olmalı gibi görünüyor. Önerinizi uygulayabildim ve bu konuyla ilgili oldu, bu yüzden teşekkürler! – CorayThan

+0

@CorayThan Bu Eclipse değil. Bu da Intellij'de derlenmiyor. NetBeans'de –

+0

ile aynı. –

44

Ayrıca biraz daha kısa ve öz yolu bu zaman yerine yapmak sözdizimi kullanmaktır aşmanın.

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

Harika bahşiş! Bu kabul edilmeli! –

+0

Bu en temiz çözümdür. – Scott

+0

Başar ... yup, en temiz çözüm. Çok teşekkürler. –

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

OngoingStubbing<Class<?>>Mockito.when tarafından döndürülen her çünkü ongoingStubbing aynı türde değil '?' joker karakter farklı bir türe bağlı olabilir.

türleri maç yapmak için, açıkça türü parametresi belirtmek gerekir:

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

Bölüm: 'Mockito. > anahtar olduğunda. Cevap için teşekkürler. –

+0

Benim düşünceme göre, açık yazmayı kullanmak şu anda 'doğru' cevabı olandan daha zarif bir çözümdür –

1

Burada ilk kabul cevabım kullanılan methodParameter.getParameterType() kullanımı ile biraz kafa kod örnekleri bulundu SandBoxTest. Biraz daha kazma yaptıktan sonra daha iyi bir örnek sağlayan another thread pertaining to this issue'u buldum. Bu örnek, ihtiyacım olan Mockito çağrısının doReturn (myExpectedClass) .when (myMock) .callsMyMethod (withAnyParams ile) olduğunu netleştirdi. Bu formu kullanmak, bir Sınıf geri dönüşü ile dalga geçmeme izin veriyor. Umarım bu not, gelecekte benzer bir sorun üzerinde arama yapmanıza yardımcı olur.