2016-09-09 12 views
16

Mam klasę programu ładującego grafikę i muszę przetestować w niej pewne statyczne metody. Ponieważ Mockito nie obsługuje statycznych metod, przełączyłem się na Power Mockito. Ale metoda statyczna jestem testowania ma wywołanie metodyWywoływanie metod szykujących za pomocą power mockito - org.powermock.api.mockito.ClassNotPreparedException

Base64.encodeToString(byteArray, Base64.DEFAULT); 

Aby to Mock używam mockStatic sposób jak poniżej @PrepareForTest adnotacji.

PowerMockito.mockStatic(Base64.class); 

Ale studio Android zwraca mi wciąż zwracający mi błąd, jak poniżej.

org.powermock.api.mockito.ClassNotPreparedException: Klasa android.util.Base64 przygotowany do badania. Aby przygotować tę klasę, dodaj klasę do adnotacji "@PrepareForTest".

Poniżej znajduje się mój pełny kod.

Kod powinien być badany:

import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.util.Base64; 
import android.widget.ImageView; 

    public static String convertBitmapToBase64(Bitmap imageBitmap, boolean withCompression) { 
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); 
    imageBitmap.compress(Bitmap.CompressFormat.PNG, 120, byteArrayOutputStream); 
    byte[] byteArray = byteArrayOutputStream.toByteArray(); 
    return Base64.encodeToString(byteArray, Base64.DEFAULT); 
} 

testowy kod klasy

import android.graphics.Bitmap; 
import android.util.Base64; 
import org.junit.Before; 
import org.junit.runner.RunWith; 
import org.mockito.MockitoAnnotations; 
import org.powermock.api.mockito.PowerMockito; 
import org.powermock.core.classloader.annotations.PrepareForTest; 
import org.powermock.modules.junit4.PowerMockRunner; 
import org.testng.annotations.Test; 

@RunWith(PowerMockRunner.class) 
@PrepareForTest({Base64.class}) 
public class ImageLoaderTest { 
@Test 
    public void testConvertBitmap(){ 
    byte[] array = new byte[20]; 
    PowerMockito.mockStatic(Base64.class); 
    PowerMockito.when(Base64.encodeToString(array, Base64.DEFAULT)).thenReturn("asdfghjkl"); 
    Bitmap mockedBitmap= PowerMockito.mock(Bitmap.class); 
    String output = ImageLoaderUtils.convertBitmapToBase64(mockedBitmap); 
    assert (!output.isEmpty()); 
} 

}

Gradle Zależności

testCompile 'junit:junit:4.12' 
testCompile 'org.powermock:powermock:1.6.5' 
testCompile 'org.powermock:powermock-module-junit4:1.6.5' 
testCompile 'org.powermock:powermock-api-mockito:1.6.5' 
+0

pokazać nam swoje import – JEY

+0

@JEY Import dodał. Zarówno klasa testowa, jak i klasa, która ma być testowana, używają tego samego importu. –

+2

używasz JUnit lub TestNG? ponieważ adnotacja testowa jest importowana z TestNG. – JEY

Odpowiedz

9

krótka odpowiedź nie można. Tutaj z FAQ:

Jakie są ograniczenia Mockito

  • Nie można drwić klas końcowych
  • Nie można drwić metody statyczne
  • Nie można drwić metod ostatecznych - ich prawdziwe zachowanie jest wykonywany bez wyjątku . Mockito nie może ostrzec Cię przed kpiną z ostatecznych metod, więc bądź czujny.

Dalsze informacje na temat tego ograniczenia:

mogę Mock metody statyczne?

Nie. Mockito preferuje orientację obiektu i wstrzyknięcie zależności od statyczny, kod proceduralny, który jest trudny do zrozumienia. & Zmiana. Jeśli wyłączysz przerażający kod starszego typu, możesz użyć JMockit lub Powermock, aby pozorować metody statyczne: .

Jeśli chcesz użyć PowerMock spróbuj tak:

@RunWith(PowerMockRunner.class) 
@PrepareForTest({ Base64.class }) 
public class YourTestCase { 
    @Test 
    public void testStatic() { 
     mockStatic(Base64.class); 
     when(Base64.encodeToString(argument)).thenReturn("expected result"); 
    } 
} 

Więcej na powermock test sample

-3

Naprawdę trywialnie, myślę, że dzwonisz prepareForTest nieprawidłowo. Powinno być prepareForTest(Base64.class) nie prepareForTest({Base64.class}) (zwróć uwagę na falowane szelki w kodzie). Biorąc pod uwagę błąd, który otrzymujesz, myślę, że to jest istotne.

+1

Wsporniki służą do drwić wiele klas. Jeśli masz tylko jedną klasę, możesz unikać nawiasów klamrowych. Ale dla wielu klas, klasy mogą być wymienione w nawiasach rozdzielonych przecinkami. –

Powiązane problemy