Reputation: 377
So I've been struggling pretty much all day trying to get Mockito to work for my Android project. I added everything to my Gradle build file:
androidTestCompile 'org.mockito:mockito-core:2.0.29-beta'
androidTestCompile "junit:junit:4.12-beta-3"
androidTestCompile 'com.google.dexmaker:dexmaker:1.2'
androidTestCompile 'com.google.dexmaker:dexmaker-mockito:1.2'
and have tried running a test that doesn't really do anything:
@RunWith(MockitoJUnitRunner.class)
public class LoginActivityTest extends
ActivityInstrumentationTestCase2<LoginActivity> {
private LoginActivity loginActivity;
private EditText et_email;
private EditText et_password;
private Button btn_login;
@Mock
SpiceManager manager;
public LoginActivityTest(){
super(LoginActivity.class);
}
@Override
public void setUp() throws Exception {
super.setUp();
loginActivity = getActivity();
MockitoAnnotations.initMocks(this);
//manager = mock(SpiceManager.class);
loginActivity.spiceManager = manager;
et_email = (EditText) loginActivity.findViewById(R.id.et_email);
et_password = (EditText) loginActivity.findViewById(R.id.et_password);
btn_login = (Button) loginActivity.findViewById(R.id.btn_login);
}
@Override
public void tearDown() throws Exception {
super.tearDown();
}
public void testLoginEmpty() throws Exception {
verify(manager).execute(
any(LoginRequest.class),
anyString(),
anyLong(),
any(LoginActivity.LoginRequestListener.class));
}
}
The reason I want to mock the service is because I would like to keep the network part out the test. There's no need to actually send a network request for a simple test, right?
Anyhow, the app builds but when the actual test starts running it fails (or rather crashes) with an AbstractMethodError
:
Running tests
Test running started
java.lang.AbstractMethodError: abstract method
"org.mockito.plugins.MockMaker$TypeMockability
org.mockito.plugins.MockMaker.isTypeMockable(java.lang.Class)"
at org.mockito.internal.util.MockUtil.typeMockabilityOf(MockUtil.java:26)
at org.mockito.internal.util.MockCreationValidator.validateType(MockCreationValidator.java:21)
at org.mockito.internal.creation.MockSettingsImpl.validatedSettings(MockSettingsImpl.java:167)
at org.mockito.internal.creation.MockSettingsImpl.confirm(MockSettingsImpl.java:161)
at org.mockito.internal.MockitoCore.mock(MockitoCore.java:58)
at org.mockito.Mockito.mock(Mockito.java:1410)
at org.mockito.Mockito.mock(Mockito.java:1288)
at be.sanmax.membr.activities.LoginActivityTest.setUp(LoginActivityTest.java:50)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:191)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:176)
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:555)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1837)
This strikes me as odd since the SpiceManager
class does not contain any abstract
methods.
It is, however, part of some package that I didn't write (com.octo.android.robospice
). But that shouldn't be an issue. Should it?
And if that is the issue, how could I go about factoring it out from any tests? I only want to test the working of the app, not the network connection...
Upvotes: 14
Views: 12365
Reputation: 583
Dexmaker does not support Mockito 2.0 since the definition of MockMaker
has changed. I suggest you use Mockito 1.10.19 but then you will run into this NPE for which I have submitted a fix.
Looks like my fix is now merged into dexmaker as of version 1.5
Upvotes: 16
Reputation: 264
Use mockito-android instead of mockti-core for instrumentation tests.
Upvotes: 2
Reputation: 2156
For me it helped to use newest dexmaker (and remove all other powermock/mockito dependencies):
androidTestCompile 'com.linkedin.dexmaker:dexmaker-mockito:2.2.0'
Upvotes: 14
Reputation: 1368
For me it helped switching from mockito to powermock. Downgrading mockito to 1.x gave me the null exception, updgrading to 2.x gave me the AbstractMethodError. Just include in dependencies (instead of mockito):
testCompile "org.powermock:powermock-module-junit4:1.6.5"
testCompile "org.powermock:powermock-module-junit4-rule:1.6.5"
testCompile "org.powermock:powermock-api-mockito:1.6.5"
testCompile "org.powermock:powermock-classloading-xstream:1.6.5"
Upvotes: -1
Reputation: 244
Mockito.initAnnotations
and @RunWith
are incompatible to each other. They both initialize the annotations. Try to remove one of the two. I suggested to keep the runner.
Upvotes: 1