Mockito AbstractMethodError on initMocks

匿名 (未验证) 提交于 2019-12-03 01:23:02

问题:

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 {      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...

回答1:

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.



回答2:

For me it helped to use newest dexmaker (and remove all other powermock/mockito dependencies):

    androidTestCompile 'com.linkedin.dexmaker:dexmaker-mockito:2.2.0'


回答3:

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.



回答4:

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"


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!