2014-07-23 16 views
6

Sto provando a verificare che "setTabs()" venga chiamato quando eseguo il metodo "onCreate (IHomeView iHomeView)" della mia classe HomePresenter. "SetTabs()" è un metodo di interfaccia in IHomeView. Per provarlo, io uso Mockito, ma ho un IllegalArgumentException quando chiamo a homeView.setTabs()IllegalArgumentException con Mockito

metto qui il mio codice, è molto semplice:

mia semplice test:

import junit.framework.Assert; 

import org.junit.Before; 
import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.robolectric.RobolectricTestRunner; 
import org.robolectric.annotation.Config; 

import static org.fest.assertions.api.Assertions.assertThat; 
import static org.mockito.Mockito.mock; 
import static org.mockito.Mockito.times; 
import static org.mockito.Mockito.verify; 
import static org.robolectric.util.FragmentTestUtil.startFragment; 

@RunWith(RobolectricTestRunner.class) 
public class HomeFragmentTest { 

    @Test 
    public void testOnCreateHomePresenter() { 
     IHomeView homeViewMock = mock(IHomeView.class); 

     HomePresenter homePresenter = new HomePresenter(); 
     homePresenter.onCreate(homeViewMock); 

     verify(homeViewMock, times(1)).setTabs(); 
    } 
} 

IHomeView.class

public interface IHomeView { 

    public void setTabs(); 

} 

HomePresenter.java

public class HomePresenter implements IHomePresenter { 

private IHomeView mHomeView; 

public void onCreate(IHomeView homeView) { 
    mHomeView = homeView; 

    mHomeView.setTabs(); 
} 
} 

HomeFragment -> implementa IHomeView

public class HomeFragment extends RoboFragment implements IHomeView { 

@Inject 
HomePresenter mHomePresenter; 
@InjectView(R.id.tv1) 
TextView textView; 
@InjectView(R.id.progessbar) 
SmoothProgressBar progressBar; 
@InjectView(R.id.pager) 
private ViewPager mViewPager; 
@InjectView(R.id.tabs) 
private PagerSlidingTabStrip tabs; 

private TabAdapter mAdapter; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 

    View rootView = inflater.inflate(R.layout.fragment_home, container, 
      false); 

    if (rootView == null) 
     throw new IllegalStateException("Can't inflate the view"); 

    return rootView; 
} 

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 
    Logger.logWarning("=>onViewCreated()"); 

    progressBar.setProgressiveStartActivated(true); 

    mHomePresenter.onCreate(this); 
} 


@Override 
public void setTabs() { 
    mAdapter = new TabAdapter(getChildFragmentManager(), getResources()); 
    mViewPager.setAdapter(mAdapter); 

    int marginBetweenPages = getMarginBetweenPages(); 
    mViewPager.setPageMargin(marginBetweenPages); 
    tabs.setViewPager(mViewPager); 
} 
} 

Dipendenze presso build.gradle

compile 'com.android.support:appcompat-v7:20.0.+' 
compile 'com.android.support:support-v4:20.+' 
compile 'com.crashlytics.android:crashlytics:1.+' 
compile 'net.hockeyapp.android:HockeySDK:3.0.2' 
compile 'com.squareup.retrofit:retrofit:1.6.1' 
compile 'com.squareup.okhttp:okhttp-urlconnection:2.0.0' 
compile 'com.squareup.okhttp:okhttp:2.0.0' 
compile 'com.github.castorflex.smoothprogressbar:library:0.5.2' 
compile 'com.astuetz:pagerslidingtabstrip:1.0.1' 
compile 'net.hockeyapp.android:HockeySDK:3.0.2' 
compile('org.roboguice:roboguice:3.0-alpha-2') { 
    exclude module: 'asm' 
} 

compile('fr.avianey:facebook-android-api:[email protected]') { 
    exclude group: 'com.google.android', module: 'support-v4' 
} 

// ================== TESTING LIBRARIES ====================== 
androidTestCompile 'junit:junit:4.10' 
androidTestCompile 'org.robolectric:robolectric:2.3' 
androidTestCompile 'com.squareup:fest-android:1.0.+' 
androidTestCompile 'org.bouncycastle:bcprov-jdk15on:1.50' 
androidTestCompile 'com.jakewharton:butterknife:5.1.0' 
androidTestCompile 'org.mockito:mockito-core:1.9.5' 
androidTestCompile 'com.google.dexmaker:dexmaker:1.0' 
androidTestCompile 'com.google.dexmaker:dexmaker-mockito:1.0' 

Inoltre, ho cercato di commentare tutti i metodi all'interno setTabs(), ma non funziona. Sto usando Mockito 1.9.5 e Robolectric 2.3. Io uso Android Studio 0.8.1 e il comando per eseguire il test è:

./gradlew test 

credo, il test è molto semplice, ma non farlo funzionare. Qualcuno potrebbe dire cosa sto facendo di sbagliato?

Anche io includere l'output Gradle:

java.lang.IllegalArgumentException 
    at com.google.dexmaker.mockito.InvocationHandlerAdapter.invoke(InvocationHandlerAdapter.java:49) 
    at com.sun.proxy.$Proxy31.setTabs(Unknown Source) 
    at com.peerade.ave.presenters.HomePresenter.onCreate(HomePresenter.java:24) 
    at com.peerade.ave.tests.HomeFragmentTest.testOnCreateHomePresenter(HomeFragmentTest.java:56) 

Gradle test esecutore 1 terminato l'esecuzione test.

Grazie mille!

FISSO!

Se rimuovi dexmaker e dexmaker-mockito da androidTestCompile, funzionerà come un incantesimo. Ho trovato la soluzione qui: https://code.google.com/p/dexmaker/issues/detail?id=4

+0

Il tuo codice di test sembra corretto. Potresti postare anche la sezione "importa" della tua classe di test e il messaggio di errore che ottieni? –

+0

Includo solo più informazioni @ManuelFranco. – juanjo

+0

Stavi usando ART quando è successo? Ho un'eccezione simile, ma la semplice rimozione di dexmaker e dexmaker-mockito non ha risolto il problema, ma crea altri problemi. Posso rimuovere Dexmaker e avere lo stesso errore, ma senza dexmaker-mockito ho ancora più problemi. Ecco qualche altro background: https://github.com/mockito/mockito/issues/71 – billmag

risposta

7

Nel mio caso, l'aggiornamento e Mockito Dexmaker alle ultime versioni risolto il problema: androidTestCompile 'org.mockito:mockito-core:1.10.5' androidTestCompile 'com.crittercism.dexmaker:dexmaker:1.4' androidTestCompile 'com.crittercism.dexmaker:dexmaker-mockito:1.4' androidTestCompile 'com.crittercism.dexmaker:dexmaker-dx:1.4'

Problemi correlati