【问题标题】:Mocking in Android在 Android 中模拟
【发布时间】:2015-10-01 18:01:28
【问题描述】:

我正在尝试在 Android 应用程序中测试 KeyguardManager 类的 isKeyguardSecure() 方法。

我尝试使用EasyMockMockitoPowerMock 创建模拟KeyguardManager 对象,但失败了。以下是我的尝试和收到的错误消息。


EasyMock

KeyguardManager keyguardManagerMock = EasyMock.createMock(KeyguardManager.class);

错误信息:java.lang.IllegalArgumentException: android.app.KeyguardManager is not an interface


Mockito 和 PowerMock

KeyguardManager mockedKeyguardManager = Mockito.mock(KeyguardManager.class); KeyguardManager mockedKeyguardManager = PowerMockito.mock(KeyguardManager.class);

错误消息:java.lang.VerifyError: mockit/internal/startup/Startup java.lang.VerifyError: org/mockito/cglib/core/ReflectUtils


One explanation for this 指出根本问题在于 Android 设备运行的 Dalvik 虚拟机。任何人都可以验证这一点吗?是否可以使用任何可用于测试 Android 应用的可用模拟库来模拟 KeyguardManager 类?

谢谢!

【问题讨论】:

  • 出于好奇,您为什么要尝试测试内置方法的功能?

标签: android unit-testing mocking mockito easymock


【解决方案1】:

您的 EasyMock 版本太旧。 PowerMock 不是必需的。使用 EasyMock 3.4,我做了以下工作,效果很好:

public static void main(String[] args) {
    KeyguardManager manager = createMock(KeyguardManager.class);
    expect(manager.isKeyguardSecure()).andReturn(true);
    replay(manager);
    assertTrue(manager.isKeyguardSecure());
    verify(manager);
}

【讨论】:

  • 您是否在 Android 项目中尝试过这个?当我尝试在 Android 项目中运行您的代码时,我收到错误消息:java.lang.VerifyError: org/easymock/cglib/core/ReflectUtils
  • 有趣。我从 EasyMock Android 测试项目运行它。 Cglib 不应该用于 Android。您可以在org.easymock.internal.AndroidSupport 中进行调试以查看其行为是否正确。你能创建一个显示错误的演示项目吗?这可能是 EasyMock 中的一个错误。
【解决方案2】:

将 PowerMock 与 EasyMock 结合使用。

依赖关系:

testCompile 'junit:junit:4.12'
testCompile 'org.easymock:easymock:3.3.1'
testCompile 'org.powermock:powermock-core:1.6.2'
testCompile 'org.powermock:powermock-api-easymock:1.6.2'
testCompile 'org.powermock:powermock-module-junit4:1.6.2'

示例代码:

package com.example.user.exampleapp;

import android.app.KeyguardManager;

import org.easymock.EasyMock;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.easymock.PowerMock;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

@RunWith(PowerMockRunner.class)
@PrepareForTest(KeyguardManager.class)
public class KeyguardTest {

    @Test
    public void testKeyguard() {
        KeyguardManager keyguardMock = PowerMock.createMock(KeyguardManager.class);
        EasyMock.expect(keyguardMock.isKeyguardSecure()).andReturn(false);
        PowerMock.replayAll();
        System.out.println("is locked " + keyguardMock.isKeyguardSecure());
        PowerMock.verifyAll();
    }
}

输出:

is locked false

【讨论】:

  • 您是否在 Android 项目中尝试过这个?当我尝试在 Android 项目中运行您的代码时,收到错误消息:java.lang.VerifyError: org/easymock/cglib/core/ReflectUtils
  • @spookymodem 是的,我编译它并在 Android Studio 中运行,控制台的输出是真实的。
猜你喜欢
  • 1970-01-01
  • 2011-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多