2014-07-23 14 views
6

Ich versuche zu testen, dass "setTabs()" aufgerufen wird, wenn ich die Methode "onCreate (IHomeView iHomeView)" meiner HomePresenter-Klasse ausführen. "SetTabs()" ist eine Interface-Methode in IHomeView. Um es zu testen, verwende ich Mockito, aber ich erhalte eine Illegal wenn ich homeView.setTabs() aufrufenIllegalArgumentException mit Mockito

ich hier mein Code zu setzen, ist es sehr einfach:

Mein einfachen 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 -> implementiert 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); 
} 
} 

Abhängigkeiten bei 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' 

Auch habe ich versucht, alle Methoden innerhalb settabs Kommentar(), aber es funktioniert nicht. Ich benutze Mockito 1.9.5 und Robolectric 2.3. Ich benutze Android Studio 0.8.1 und der Befehl zur Ausführung des Tests ist:

./gradlew test 

Ich denke, der Test ist sehr einfach, aber ich verstehe es nicht zu arbeiten. Könnte jemand sagen, was ich falsch mache?

Auch schließe ich die gradle Ausgabe:

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-Executor abgeschlossen 1-Tests ausgeführt werden.

Vielen Dank!

BEHOBEN!

Wenn Sie dexmaker und dexmaker-mockito von androidTestCompile entfernen, wird es wie ein Charme funktionieren. Ich fand die Lösung hier: https://code.google.com/p/dexmaker/issues/detail?id=4

+0

Ihr Test-Code scheint korrekt. Könnten Sie auch das "Import" -Sektin Ihrer Testklasse und die Fehlermeldung, die Sie bekommen, posten? –

+0

Ich habe nur weitere Informationen @ManuelFranco. – juanjo

+0

Haben Sie ART verwendet, als das passierte? Ich habe eine ähnliche Ausnahme, aber nur Dexmaker und Dexmaker-Mockito zu entfernen hat es nicht behoben, es schafft andere Probleme. Ich kann dexmaker entfernen und habe immer noch den gleichen Fehler, aber ohne Dexmaker-Mockito bekomme ich noch mehr Probleme. Hier ist ein paar weitere Hintergrund: https://github.com/mockito/mockito/issues/71 – billmag

Antwort

7

In meinem Fall eines Upgrade Mockito und Dexmaker auf die neuesten Versionen das Problem behoben: 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'

Verwandte Themen