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
Ihr Test-Code scheint korrekt. Könnten Sie auch das "Import" -Sektin Ihrer Testklasse und die Fehlermeldung, die Sie bekommen, posten? –
Ich habe nur weitere Informationen @ManuelFranco. – juanjo
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