2015-11-21 112 views
9

我試圖在Android中使用http://developer.android.com/reference/android/util/Base64.html類來解碼Base64編碼的字符串。Android Base64編碼和解碼在單元測試中返回null

無論是encodeToString和解碼方法返回null,我不知道什麼是錯的,這是我的解碼碼:

// Should decode to "GRC" 
String friendlyNameBase64Encoded = "R1JD"; 

// This returns null 
byte[] friendlyNameByteArray = Base64.decode(friendlyNameBase64Encoded, Base64.DEFAULT); 

// Fails with NullPointerException 
String friendlyName = new String(friendlyNameByteArray, "UTF-8"); 

我運行Android API 23.1.0

+1

能你請發佈logcat消息?順便說一句,我成功地從您發佈的代碼中獲取解碼的字符串,即GRC。 – Suhas

+0

所以,直到現在我只能從單元測試中運行這段代碼。我剛剛運行該應用程序的真實,它似乎工作。任何想法在單元測試中可能會出錯? – brnby

+0

可能由於使用unitTests.returnDefaultValues = true – brnby

回答

12

我在我的單元測試中有同樣的問題。我沒有意識到我使用的Base64類是Android API的一部分,因此

在常規JUnit測試中不能使用android.util.Base64,它必須是Instrumentation測試。

但是,如果您真的希望將其作爲單元測試,則可以改爲使用Apache Commons Base64類。它包括在搖籃構建:

// https://mvnrepository.com/artifact/org.apache.commons/commons-collections4 
compile group: 'org.apache.commons', name: 'commons-collections4', version: '4.1' 

然後稍微不同的使用情況,

+0

編譯組:'commons-codec',名稱:'commons-codec',版本:'1.9' 是爲我工作的依賴項。 – user2481857

0

跟進ØAndroid的教程,並在您需要不使用你根據android.Base64某些Android庫

在你的情況只是單元測試單元測試的注意事項。我有類似的問題,並從src/test - >src/androidTest工作移動測試類。這些測試運行在虛擬機或真正的Android設備上。第一次看時,我沒有注意到差異。

0

可以使用Robolectric亞軍

  1. 添加的依賴在你build.gradle

    testCompile 'org.robolectric:robolectric:X.X.X' 
    
  2. 添加在您的測試類這一行:

    import org.junit.runner.RunWith; 
    import org.robolectric.RobolectricTestRunner; 
    
    @RunWith(RobolectricTestRunner.class) 
    public class MyTestingClassTest { 
        ... 
    }