Archiwa tagu: captor

Mockito – „łapiemy” argumenty wywołania metod

Temat Mockito był już na tym blogu poruszany kilkakrotnie (np. TU i TU). Opisywałem jak można wykorzystać to narzędzie do mockowania oraz weryfikacji wywołania metod. W tym drugim przypadku często zachodzi także konieczność wykonania dodatkowych asercji na argumencie weryfikowanej metody. Aby upewnić się, że program działa poprawnie, oprócz samego faktu wykonania metody sprawdzamy, czy jej argumenty mają poprawne wartości pól. Pomocna w takiej sytuacji jest klasa ArgumentCaptor będąca częścią Mockito. Poniżej znajdziecie przykładowy test, który z niej korzysta.
 

public class SampleTest
{
  private Canvas canvas;
  private CanvasPainter painter;

  @Before
  public void setUp() throws Exception
  {
    canvas = mock(Canvas.class);
    painter = new CanvasPainter(canvas);
  }

  @Test
  public void testDraw() throws Exception
  {
    Point point = new Point(1, 2);
    painter.addPoint(point);

    painter.draw();

    ArgumentCaptor captor = ArgumentCaptor.forClass(Point.class);
    verify(canvas, times(1)).draw(captor.capture());

    Point captured = captor.getValue();
    assertThat(captured.getX(), is(1D));
    assertThat(captured.getY(), is(2D));
  }
}

 
Kod jest chyba na tyle prosty, że nie wymaga dłuższego komentarza. Sprawdzamy w nim, czy wykonanie metody draw() klasy CanvasPainter powoduje wykonanie metody draw() klasy Canvas dla każdego punktu, który został dodany przy pomocy metody addPoint(). Prócz samego wywołania chcemy też sprawdzić, że przekazany do metody draw() klasy Canvas obiekt ma odpowiednie wartości pól x i y.