2015-10-01 76 views
0

我試圖在Android應用程序中測試KeyguardManager類的isKeyguardSecure()方法。在Android中嘲弄

我試過了,並且使用EasyMock,MockitoPowerMock創建了一個模擬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指出問題的根源是與Dalvik虛擬機,其Android設備運行。任何人都可以驗證此?是否有可能使用可用於測試Android應用程序的任何可用模擬庫來模擬KeyguardManager類?

謝謝!

+0

出於好奇,你爲什麼要測試內置方法的功能? – jyanks

回答

0

在EasyMock中使用PowerMock。

依賴關係:

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 
+0

您是否在Android項目中嘗試過這種方法?當我嘗試在Android項目中運行代碼時,我收到錯誤:'java.lang.VerifyError:org/easymock/cglib/core/ReflectUtils' – spookymodem

+0

@spookymodem yes編譯它並在Android Studio中運行,輸出結果爲從控制檯真實。 – sswierczek

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); 
} 
+0

你在Android項目中試過這個嗎?當我嘗試在Android項目中運行代碼時,我收到錯誤:'java.lang.VerifyError:org/easymock/cglib/core/ReflectUtils' – spookymodem

+0

有趣。我從EasyMock Android測試項目運行它。 Cglib不應該用於Android。你可以在'org.easymock.internal.AndroidSupport'中進行調試,看看它是否正確。你能否創建一個演示項目來顯示錯誤?這可能是EasyMock中的一個錯誤。 – Henri