EasyMock – łatwy sposób na testy jednostkowe

      3 min read           ·

EasyMock to biblioteka języka Java, która umożliwia tworzenie obiektów w locie i wykorzystywanie ich jako mock’ów (imitacji prawdziwych obiektów). Dzięki tej możliwości testowanie jednostkowe może być o wiele prostsze, ponieważ możemy zastąpić prawdziwe, często ciężkie obiekty przez mock’i. Dodatkowo pozwala nam się to skupić na testowaniu jednej klasy podczas gdy zachowanie obiektów innych klas możemy dokładnie zaplanować.

Przykładowo mając klasę:

`

public class Car {
    private Engine engine;
    private Computer onboardComputer;

public Car(Engine engine, Computer onboardComputer) {
this.engine = engine;
this.onboardComputer = onboardComputer;
}

public boolean start() {
if (onboardComputer.checkSystems()) {
    engine.launch();
    return true;
} else {
    List<Problem> problems = new LinkedList<Problem>();
    problems = onboardComputer.getProblems();
    notifyProblems(problems);
    return false;
}
}
[..]

}

`

Chcąc przetestować działanie metody start() trzeba zapewnić silnik i komputer pokładowy dla samochodu. Metoda start() ma zlecić komputerowi sprawdzenie stanu systemów i jeśli wszystko jest w porządku odpalić silnik. Jeśli komputer pokaże, że któryś z systemów jest niesprawny, musi pobrać od niego listę problemów.

Chcąc skupić się na testowaniu samego samochodu, trzeba być pewnym w jaki sposób zachowa się w danej sytuacji obiekt komputera pokładowego i silnika. Te obiekty można więc mockować z użyciem EasyMock.

Klasa testowa będzie wyglądać następująco:

`

public class CarTest {

private Car car;

// test sprawdzający przypadek poprawnego odpalenia samochodu
@Test
public void testStart_ok() {
// tworzymy mock silnika
Engine mockEngine = EasyMock.createMock(Engine.class);
// ustalamy, że na obiekcie mockEngine powinna być wywołana metoda
// launch();
mockEngine.launch();
EasyMock.expectLastCall();

// tworzymy mock komputera pokładowego
Computer mockComputer = EasyMock.createMock(Computer.class);
// ustawiamy działanie mocka komputera - przy checkSystem() mock zwróci
// true
EasyMock.expect(mockComputer.checkSystems()).andReturn(true);

// kończymy nagrywanie działania mocków i uruchamiamy je do działania
EasyMock.replay(mockEngine, mockComputer);

// testujemy
car = new Car(mockEngine, mockComputer);
assertTrue(car.start());

}

@Test
public void testStart_failed() throws Exception {
// tworzymy mock silnika
Engine mockEngine = EasyMock.createMock(Engine.class);
// tym razem na obiekcie silnika nie powinna być wywołana żadna metoda

// tworzymy mock komputera pokładowego
Computer mockComputer = EasyMock.createMock(Computer.class);
// ustawiamy działanie mocka komputera - przy checkSystem() mock zwróci
// false
EasyMock.expect(mockComputer.checkSystems()).andReturn(false);
// przy wywołaniu getProblems zwróci pustą listę problemów
List<Problem> problems = new LinkedList<Problem>();
EasyMock.expect(mockComputer.getProblems()).andReturn(problems);

// kończymy nagrywanie działania mocków i uruchamiamy je do działania
EasyMock.replay(mockEngine, mockComputer);

// testujemy
car = new Car(mockEngine, mockComputer);
assertFalse(car.start());
}

}

`

Pokazane testy sprawdzą nie tylko wynik zwrócony przez metodę start, ale także czy zostały wywołane odpowiednie metody w innych klasach.

Jak widać, użycie EasyMock wiele ułatwia. To może być szczególnie przydatne kiedy konieczne jest testowanie zachowania metod, a nie tylko do zwracanego wyniku.

Przestawiony przykład to tylko drobny pokaz możliwości EasyMock. Po więcej informacji odsyłam do bardzo dobrej dokumentacji dostępnej na oficjalnej stronie EasyMock

comments powered by Disqus