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
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? –
Includo solo più informazioni @ManuelFranco. – juanjo
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