2013-03-09 93 views
12

我創建了一個新的Android測試項目。我從https://code.google.com/p/powermock/downloads/list下載了powermock-mockito-junit-1-1.5.zip。我將所有庫添加到測試項目的libs文件夾中。測試類是一個非常簡單的對象:如何在Android項目中使用PowerMock?

package com.test.test; 

import org.junit.runner.RunWith; 
import org.powermock.modules.junit4.PowerMockRunner; 

import android.util.Log; 

@RunWith(PowerMockRunner.class) 
public class TestTestAndroid { 

    public void testRuns() { 
     Log.e("test", "Test case is called"); 
    } 
} 

然後,我嘗試從Eclipse運行項目或從命令行創建項目。我得到了同樣的錯誤:

Conversion to Dalvik format failed: Unable to execute dex: Multiple dex files define Lorg/hamcrest/Description;

事實證明,無論是junit-4.8.2.jarmockito-all-1.9.5.jar定義org.hamcrest.Description。我必須加入Mockito罐子,原因很明顯 - 我需要Mockito。 Android提供了不同版本的JUnit,但它是舊版本,不包含@RunWith註釋。

有人能回答如何使用powermock和中的Mockito的Android項目,沒有衝突org.hamcrest.Description問題?

回答

10

很抱歉,您不能在Dalvik虛擬機使用PowerMock。

PowerMock的工作原理是,它使用Javassist修改類的字節碼定製的ClassLoader下運行測試。這在正常的JVM上工作正常,但在Dalvik上字節碼和類格式不同,所以這種方法不起作用。 PowerMock需要重寫爲使用Dexmaker而不是Javassist--這絕對是不平凡的,我在PowerMock issues list上看不到這樣的東西。

+0

如果你不能在Android上使用PowerMock,你知道任何其他方式來存根Android上的靜態方法? – lowellk 2014-04-03 19:20:31

+5

@lowellk有一個解決方法。有一個非靜態方法調用靜態方法,然後將其存根。例如,如果'HttpConstants.getUrl()'是一個靜態方法,則編寫另一個方法:'String getUrl(){return HttpConstants.getUrl();然後,您可以將該方法存根。 – 2014-07-12 21:49:45

+0

+1 @ MattQuigley的提示 – 2014-07-24 00:31:55

8

其實,我覺得這是完全不真實的(至少在最新版本)。

在我gradle這個設置的,我想測試我的代碼模塊我有

// Mockito and PowerMock 
androidTestCompile ('org.powermock:powermock-mockito-release-full:1.6.0') { 
    exclude module: 'hamcrest-core' 
    exclude module: 'objenesis' 
} 

,一切運行正常。只要我使用:

@RunWith(PowerMockRunner.class) @PrepareForTest(ClassToMock.class) 

註釋我的類別(例如,不能與Robolectric運行,依然在CI環境罰款)

+1

你能發佈完整的gradle設置嗎?我找不到PowerMockRunner.class – 2015-03-30 16:58:19

+0

進口不幸的是,我不能因爲它是我們公司的應用程序的一部分,但它應該在那裏,通過導入'進口org.powermock.modules.junit4.PowerMockRunner;'只要確保如果你正在使用androidTestCompile,使用這種進口的儀器測試是在androidTest文件夾等 – AllDayAmazing 2015-03-31 18:49:21

+0

確定,但有進口我需要有以下編譯gradle這個: androidTestCompile「org.powermock:powermock模塊,junit4: 1.6.2' 這導致了很多問題,例如:「定義了多個dex文件...」 – 2015-04-01 10:50:04

相關問題