Skip to content

Porównanie Framework'ów Testowych Mockito oraz EasyMock

Damian Muszyński edited this page Apr 19, 2021 · 7 revisions

Prosty test wykonany za pomocą EasyMock

import static org.easymock.classextension.EasyMock.*;

List mock = createNiceMock(List.class);

expect(mock.get(0)).andStubReturn("one");
expect(mock.get(1)).andStubReturn("two");
mock.clear();

replay(mock);

someCodeThatInteractsWithMock();

verify(mock); 

Prosty test wykonany za pomocą Mockito

import static org.mockito.Mockito.*;

List mock = mock(List.class);

when(mock.get(0)).thenReturn("one");
when(mock.get(1)).thenReturn("two");

someCodeThatInteractsWithMock();

verify(mock).clear();                       

Nie możesz „szpiegować” za pomocą EasyMock

Mockito ma fajną funkcję zwaną szpiegowaniem. Tworzysz rzeczywisty obiekt (nie makietę) i szpiegujesz go. Zasadniczo oznacza to, że obiekt będzie się zachowywał normalnie, ale wszystkie wywołania metod będą rejestrowane, co pozwoli na ich późniejszą weryfikację. Oto przykład:

List list = new LinkedList(); // real object
   List spy = spy(list); // spy wrapper

   //optionally, you can stub out some methods:
   when(spy.size()).thenReturn(100);

   //this method call is spied
   spy.add("one");

   // since a real add was done, get(0) will return "one"
   assertEquals("one", spy.get(0));

   //size() method was stubbed and to return 100
   assertEquals(100, spy.size());

   //optionally, you can verify that add was called as expected
   verify(spy).add("one");

W EasyMock nie ma szpiegowania jako takiego. Próbowałem jednak pomyśleć o przypadkach użycia i doszedłem do wniosku, że używając podzbioru funkcji przechwytywania EasyMock, częściowego mockowania i delegowania, powinienem być w stanie objąć je wszystkie. Może to być jednak bardziej uciążliwe. Ale myślę, że takie przypadki użycia są dość rzadkie. Nie jestem przeciwny dodawaniu funkcji szpiegowskiej, jeśli nie okaże się to błędne.

Jeśli chodzi o powyższy przykład, musimy pomyśleć o celu tego testu. Powiedzmy, że w tym przypadku mamy jakiś stary kod, dla którego chcemy się upewnić, że metoda add jest wywoływana z odpowiednim parametrem, ale chcemy zachować jej zwykłe zachowanie. Jest to dość rzadkie, ale może się zdarzyć. Możemy to zrobić w ten sposób:

// Real object
    List real = new LinkedList();
    // create the mock
    List list = createMock(List.class);

    // spy the parameter and perform the normal behavior
    Capture c = new Capture();
    expect(list.add(capture(c))).andDelegateTo(real);

    replayAll();

    // the actual test
    list.add("one");

    // get will return what was expected
    assertEquals("one", real.get(0));

    // check the capture (will throw an error if nothing was captured)
    assertEquals("one", c.getValue());

    // this is unnecessary since checking the capture is enough
    verifyAll();
Clone this wiki locally