EasyMock dla nieznanych parametrów – matchers

      2 min read           ·

W poprzednim poście pokrótce opisałem sposób działania EasyMock. W tym poście chciałbym skupić się na jednej z możliwości tej biblioteki.

Podczas testowania zdarzają się przypadki kiedy wiemy, że dana metoda obiektu zostanie wywołana i jaki wynik powinna zwrócić dla naszych testów, ale nie chcemy (albo nie jesteśmy w stanie) dokładnie analizować jakie parametry wywołania otrzyma. W takim właśnie przypadku możemy użyć matcher’ów EasyMock’a.

Wiedząc, że na mock’owanym obiekcie zostanie wywołana metoda xyz(String,int,long), równocześnie nie znając dokładnych wartości parametrów możemy przygotować mock na przyjęcie różnych parametrów.

</p> <pre> // stworzenie mocka obiektu SomeClass object = EasyMock.createMock(SomeClass.class); // nagrywamy akcję dla elastycznych parametrów object.xyz(anyObject(String.class), anyInt(), anyLong()); // ustalamy zwracany rezultat dla elastycznych parametrów podanych powyżej EasyMock.expectLastCall().andReturn(knownObject); </pre> <p>

W podanym przykładzie wywołanie na obiekcie „object” metody „xyz” spowoduje zwrócenie obiektu „knownObject” niezależnie od podanych do metody parametrów.

Ważne jest, że jeśli używamy matchera na chociaż jednym z parametrów to musimy użyć go na każdym z parametrów. Jeśli jednak chcemy żeby mock działał tylko dla dokładnie określonego parametru możemy zastosować matcher same(Object value) lub eq(Object value) jeżeli obiekt w parametrze ma być równy temu w matcher’ze.

Użycie matcherów może być szczególnie przydatne podczas testowania kodu używającego singletonów lub metod statycznych.

</p> <pre> class Communicator { public String listen(Formatter formatter) { String message = DataResource.getMessage(); String result = "RESPONSE: "; return result + formatter.format(message); } } </pre> <p>

Pomijam poprawność tak skonstruowanego kodu. Należy wziąć pod uwagę, że często przychodzi nam testować kod różnej jakości, który nie zawsze można łatwo przepisać.

Metody listen(Formatter) nie dałoby się przetestować z użyciem EasyMock, gdyby nie matchery. Metoda listen(Formatter) powinna zwrócić swój nagłówek połączony z otrzymaną treścią wiadomości sformatowaną przez podany formatter. Formatter możemy zmockować, ale nie wiemy co zwróci DataResource.getMessage(). Test ma testować metodę listen(Formatter) nie powinien więc zwracać uwagi na to co będzie wynikiem DataResource.getMessage().

`

public class CommunicatorTest {
    @Test
    public void testListen() throws Exception {
    Formatter formatter = EasyMock.createMock(Formatter.class);
    formatter.format(EasyMock.anyObject(String.class));
    EasyMock.expectLastCall().andReturn(“formatted message”);

EasyMock.replay(formatter);

Communicator comm = new Communicator();
assertEquals("RESPONSE: formatted message", comm.listen(formatter));
}

}

`

Tym sposobem formatter zawsze zwróci nam tą samą wartość niezależnie od otrzymanego od DataResource wyniku.

W EasyMock istnieje więcej matcher’ów. Ich listę można znaleźć w dokumentacji EasyMock.

comments powered by Disqus