Szukaj…


Styl BDDMockito

Styl testowania Behawior Driven Development (BDD) obraca się wokół etapów testów „podanych”, „kiedy” i „wtedy”. Jednak klasyczny Mockito używa fazy „słowo” dla „danej” i nie obejmuje innych konstrukcji języka naturalnego, które mogą obejmować BDD. Tak więc aliasy BDDMockito zostały wprowadzone w wersji 1.8.0 w celu ułatwienia testów opartych na zachowaniu.

Najczęstszą sytuacją jest kasowanie zwrotów metody. W poniższym przykładzie getStudent(String) Sposób wyśmiewali StudentRepository powróci new Student(givenName, givenScore) Po wywołaniu z argumentem, który jest równy givenName .

import static org.mockito.BDDMockito.*;

public class ScoreServiceTest {

    private StudentRepository studentRepository = mock(StudentRepository.class);

    private ScoreService objectUnderTest = new ScoreService(studentRepository);

    @Test
    public void shouldCalculateAndReturnScore() throws Exception {
        //given
        String givenName = "Johnny";
        int givenScore = 10;
        given(studentRepository.getStudent(givenName))
            .willReturn(new Student(givenName, givenScore));

        //when
        String actualScore = objectUnderTest.calculateStudentScore(givenName);

        //then
        assertEquals(givenScore, actualScore);
    }
}

Czasami pożądane jest sprawdzenie, czy wyjątek zgłoszony z zależności jest poprawnie obsługiwany lub ponownie zgłaszany w testowanej metodzie. Takie zachowanie można zablokować w „danej” fazie w następujący sposób:

willThrow(new RuntimeException())).given(mock).getData();

Czasami pożądane jest ustalenie niektórych skutków ubocznych, które powinna wprowadzić metoda pośrednicząca. Szczególnie może się przydać, gdy:

  • Metoda podstawiona to metoda, która ma zmienić wewnętrzny stan przekazywanego obiektu

  • metoda kikuta jest metodą nieważną

Takie zachowanie można ukryć w „danej” fazie za pomocą „odpowiedzi”:

willAnswer(invocation -> this.prepareData(invocation.getArguments()[0])).given(mock).processData();

Gdy pożądane jest sprawdzenie interakcji z próbą, można to zrobić w fazie „następnie” za pomocą metod should() lub should(VerificationMode) (tylko od 1.10.5):

then(mock).should().getData(); // verifies that getData() was called once
then(mock).should(times(2)).processData(); // verifies that processData() was called twice

Jeśli pożądane jest sprawdzenie, czy nie było już żadnych interakcji z próbą, poza już zweryfikowanym, można to zrobić w fazie „wtedy” za pomocą funkcji shouldHaveNoMoreInteractions() (od wersji 2.0.0):

then(mock).shouldHaveNoMoreInteractions(); // analogue of verifyNoMoreInteractions(mock) in classical Mockito

Gdy trzeba sprawdzić, czy absolutnie nie było interakcji z próbą, można to zrobić w fazie „następnie” za pomocą shouldHaveNoMoreInteractions() (od wersji 2.0.0):

then(mock).shouldHaveZeroInteractions(); // analogue of verifyZeroInteractions(mock) in classical Mockito

Gdy trzeba sprawdzić, czy metody zostały wywołane w kolejności , można to zrobić w fazie „następnie” za pomocą should(InOrder) (od 1.10.5) i should(InOrder, VerificationMode) (od 2.0.0):

InOrder inOrder = inOrder(mock);

// test body here

then(mock).should(inOrder).getData(); // the first invocation on the mock should be getData() invocation
then(mock).should(inOrder, times(2)).processData(); // the second and third invocations on the mock should be processData() invocations


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow