wtorek, 12 października 2010

PowerMock i przetestujesz wszystko...

Poprzednie dwa posty pokazywały jak można testować metody i pola prywatne klasy. Zapis nie za piękny, czytelność słaba, ogólnie takie rozwiązanie takie se. Na szczęście istnieje bardzo przyjemne narzędzie umożliwiające wyżej wymienione zagadnienia i wiele, wiele innych.

PowerMock to framework rozszerzający biblioteki takie jak: EasyMock i Mockito. Odsyłam do oficjalnej strony w celu zapoznania się na co konkretnie pozwala PowerMock. Ja używam go wraz z Mockito i nie miałem do tej pory żadnych problemów. Poniżej prosty przykład użycia.

Klasa do testów:
public class SomeClass {
    
    private Integer privateField;

    private boolean privateMethod(String s, int i){
        return false;
    }
}
Klasa testująca:
import static org.powermock.reflect.Whitebox.getField;
import static org.powermock.reflect.Whitebox.invokeMethod;

import java.lang.reflect.Field;

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

@RunWith(PowerMockRunner.class)
public class SomeClassTest {
    
    @Test
    public void shouldTestPrivateMethod() throws Exception {

        //given
        SomeClass someClass = new SomeClass();

        //when        
        boolean test = invokeMethod(someClass,"privateMethod", "Test", 1);

        //then
    }
    
    
    @Test
    public void shouldTestPrivateField() throws IllegalArgumentException, IllegalAccessException {

        //given
        SomeClass someClass = new SomeClass();

        //when
        Field field = getField(SomeClass.class, "privateField");
        Integer testInteger = (Integer) field.get(someClass);

        //then
    }
}

WhiteBox oferuje jak wspomniałem o wiele więcej i warto się z tą funkcjonalnością zaznajomić.