Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

IllegalArgumentException with Mockito

I am trying to test that "setTabs()" is called when I execute the method "onCreate(IHomeView iHomeView)" of my HomePresenter class. "SetTabs()" is a interface method in IHomeView. In order to test it, I use mockito, but I get a illegalArgumentException when I call to homeView.setTabs()

I put here my code, it is very simple:

My simple 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 --> implements 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);
}
}

Dependencies at 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:+@aar') {
    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'

Also, I have tried to comment all methods inside setTabs(), but it does not work. I am using Mockito 1.9.5 and Robolectric 2.3. I use Android Studio 0.8.1 and the command to run the test is:

./gradlew test

I think, the test is very simple,but I do not get it to work. Could somebody say what i am doing wrong?

Also I include the gradle output:

    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 1 finished executing tests.

Thanks you very much!

FIXED!

If you remove dexmaker and dexmaker-mockito from androidTestCompile, it will work like a charm. I found the solution here: https://code.google.com/p/dexmaker/issues/detail?id=4

like image 791
juanjo Avatar asked Jul 23 '14 15:07

juanjo


People also ask

Can we use Mockito and JUnit together?

Mockito is a java based mocking framework, used in conjunction with other testing frameworks such as JUnit and TestNG. It internally uses Java Reflection API and allows to create objects of a service.

What can be mocked with Mockito?

We can use Mockito class mock() method to create a mock object of a given class or interface. This is the simplest way to mock an object. We are using JUnit 5 to write test cases in conjunction with Mockito to mock objects.


1 Answers

In my case, upgrading Mockito and Dexmaker to the latest versions fixed the issue: 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'

like image 198
Thuy Trinh Avatar answered Nov 01 '22 18:11

Thuy Trinh