【问题标题】:Mockito AbstractMethodError on initMocksinitMocks 上的 Mockito AbstractMethodError
【发布时间】:2015-07-14 14:25:42
【问题描述】:

所以我整天都在努力让 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)。但这不应该是一个问题。应该吗?

如果这是问题所在,我该如何从任何测试中排除它?我只想测试应用程序的工作,而不是网络连接...

【问题讨论】:

  • tests 而不是androidTest 中运行单元测试。尽量不要使用注释。这样做:SpiceManager manager = Mockito.mock(SpiceManager.class);
  • 不知道有什么不同? android studio 只允许我制作普通包或“androidTest”包。如果您查看代码 sn-p,您会看到该行已被注释掉,因为它也不起作用。
  • @SkinnyJ 与问题无关
  • @SkinnyJ 不是同样的错误,这个问题也没有解决方案。顺便说一句,我忘了把它放在问题中,但错误发生在“MockitoAnnotations.initMocks(this)”行。我可以进行“手动”模拟,但 mockito 会让我的生活变得更轻松。
  • 我在使用 Mockito.mock() 调用时遇到了同样的问题。回到 mockito-core:2.0.17-beta 工作,他们在 2.0.18 版本中改变了一些东西,打破了(至少对我来说)在 Android 中的模拟。

标签: android unit-testing testing mockito


【解决方案1】:

Dexmaker 支持 Mockito 2.0,因为 MockMaker 的定义已更改。我建议你使用 Mockito 1.10.19 但你会遇到this NPE 我已经提交了fix

从 1.5 版开始,我的修复程序现在似乎已合并到 dexmaker 中

【讨论】:

  • 您能否参考您在哪里读到 Dexmaker 不支持 Mockito 2.0?另外,如果支持在以后的路线图上,我很感兴趣。
  • 我没有读到它不支持它 - 我只是尝试使用 Mockito 2.0 构建 dexmaker,但由于 API 更改,它对我不起作用。我不知道发布时间表是什么,但我的拉取请求仍在等待,所以我没有得到 dexmaker 得到尽可能积极维护的印象。
  • 确实,我在收到此错误时使用了2.0.42-beta。切换回1.10.19 为我解决了这个问题。
  • 我尝试使用最高 2.0.17-beta 版的 mockito,它运行良好,但新版本无法运行。
【解决方案2】:

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

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

【讨论】:

  • 这确实对我有用,但删除其他现有依赖项很重要(如提到的原始答案)。 FWIW,我找不到 2.2.0 版本,但使用了 2.19.0 版本(我知道这是不断变化和更新的)
【解决方案3】:

使用 mockito-android 而不是 mockti-core 进行仪器测试。

【讨论】:

  • 这就是我的解决方案。谢谢!
【解决方案4】:

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

【讨论】:

  • hmmm,我试过了,但它出现了一个“nullInsteadOfMockException”错误,它指出“如果你使用 @Mock 注释,不要错过 initMocks()”。那么,那是从哪里来的呢?
  • 奇怪。当我将 MockitoRunner 作为 Runner 时,我从不使用 initMocks()。请参阅参考 [mockito.googlecode.com/hg-history/1.6/javadoc/org/mockito/… 最终 yoy 可以尝试使用不带注释的 Mockito (Mockito.mock)
【解决方案5】:

对我来说,它有助于从 mockito 切换到 powermock。将 mockito 降级到 1.x 给了我空异常,升级到 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"

【讨论】:

    猜你喜欢
    • 2011-01-30
    • 2012-12-17
    • 2016-05-01
    • 2022-01-21
    • 1970-01-01
    • 2012-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多