2015-11-21 9 views
9

Próbuję odkodować kodowany ciągiem Base64 w systemie Android przy użyciu klasy http://developer.android.com/reference/android/util/Base64.html.Android Base64 koduje i dekoduje zwrot null w jednostce testowej

Zarówno zerowy metody encodeToString i dekodować wracają, a ja nie mam pojęcia co jest nie tak, tu jest mój kod do dekodowania:

// 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"); 

biegnę Android API 23.1.0

+1

Could proszę opublikuj komunikaty logcat ? Przy okazji, udało mi się uzyskać kod dekodowany, tj. GRC z kodu, który opublikowałeś. – Suhas

+0

Tak więc do tej pory korzystałem tylko z tego kodu z testu jednostkowego. Właśnie uruchomiłem aplikację i wygląda na to, że działa. Masz pojęcie, co może pójść źle w teście jednostkowym? – brnby

+0

Prawdopodobnie z powodu użycia unitTests.returnDefaultValues ​​= true – brnby

Odpowiedz

12

I miał ten sam problem w moich testach jednostkowych. Nie zdawałem sobie sprawy, że klasa Base64, której używam, jest częścią Androida API, dlatego

Nie można używać android.util.Base64 w zwykłym teście JUnit, musi to być test oprzyrządowania.

Jednakże, jeśli naprawdę chcesz go jako test jednostkowy, możesz zamiast tego użyć klasy Apache Commons Base64. Umieścić go w Gradle produkcji:

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

a następnie nieco inne wykorzystanie,

+0

grupa kompilacji: 'commons-codec', nazwa: 'commons-codec', wersja: '1.9' była zależnością, która działała dla mnie. – user2481857

0

Kontynuacja o android tutoriale i jednostkowe notatki podczas testów trzeba tylko testy urządzenia bez użycia niektórych android bibliotekami

W twoim przypadku masz zależności android.Base64. Miałem podobny problem i przeprowadzano testy testowe z src/test ->src/androidTest. Testy te są uruchamiane na maszynie wirtualnej lub prawdziwym urządzeniu z Androidem. Nie zauważyłem różnicy na pierwszy rzut oka.

0

Można użyć Robolectric Runner

  1. Dodaj zależność w build.gradle:

    testCompile 'org.robolectric:robolectric:X.X.X' 
    
  2. Dodaj tę linię w swojej klasie testowej:

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