initMocks上的Mockito AbstractMethodError

时间:2015-07-14 14:25:42

标签: android unit-testing testing mockito

所以我整天都在努力让Mockito为我的Android项目工作。 我在Gradle构建文件中添加了所有内容:

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'

并尝试过运行一项并不真正做任何事情的测试:

@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));
    }
}

我想要模拟服务的原因是因为我想保持网络部分不受测试。 没有必要实际发送简单测试的网络请求,对吧?

无论如何,应用程序构建但是当实际测试开始运行时,它会失败(或者说崩溃)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)

这让我很奇怪,因为SpiceManager类不包含任何abstract方法。 然而,它是我没有写过的一些包的一部分(com.octo.android.robospice)。但这不应成为一个问题。应该吗?

如果这是问题,我怎么能从任何测试中分解出来?我只想测试应用程序的工作,而不是网络连接......

5 个答案:

答案 0 :(得分:15)

MockMaker的定义发生变化以来,Dexmaker 支持Mockito 2.0。我建议您使用Mockito 1.10.19,但之后您将遇到this NPE,我已提交fix

答案 1 :(得分:11)

对我而言,它有助于使用最新的dexmaker(并删除所有其他powermock / mockito依赖项):

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

答案 2 :(得分:1)

Mockito.initAnnotations@RunWith彼此不兼容。他们都初始化注释。尝试删除其中一个。我建议留下跑步者。

答案 3 :(得分:0)

使用嘲笑-android代替嘲笑-核心进行工具测试。

答案 4 :(得分:-1)

对我而言,它有助于从mockito切换到powermock。将mockito降级为1.x给了我null异常,升级到2.x给了我AbstractMethodError。只需包含依赖项(而不是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"