Zoeken…


BDDMockito-stijl

Gedragsgedreven ontwikkeling (BDD) -teststijl draait om 'gegeven', 'wanneer' en 'dan' fasen in tests. Klassieke Mockito gebruikt echter de "wanneer" woord voor "gegeven" fase en bevat geen andere natuurlijke taalconstructies die BDD kunnen omvatten. Zo werden BDDMockito- aliassen geïntroduceerd in versie 1.8.0 om gedragsgestuurde tests te vergemakkelijken.

De meest voorkomende situatie is het terugsturen van een methode. In het volgende voorbeeld getStudent(String) methode getStudent(String) van de StudentRepository een new Student(givenName, givenScore) als deze wordt aangeroepen met een argument dat gelijk is aan 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);
    }
}

Soms is het wenselijk om te controleren of een uitzondering die wordt veroorzaakt door afhankelijkheid correct wordt afgehandeld of opnieuw wordt gegooid in een testmethode. Dergelijk gedrag kan op deze manier in de "gegeven" fase worden gestopt:

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

Soms is het gewenst om enkele bijwerkingen op te zetten die een koppige methode zou moeten introduceren. Vooral het kan van pas komen wanneer:

  • de stubbed-methode is een methode waarvan wordt aangenomen dat deze de interne status van een doorgegeven object verandert

  • de stubbed-methode is een nietige methode

Dergelijk gedrag kan in de "gegeven" fase worden gestopt met een "Antwoord":

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

Wanneer het gewenst is om interacties met een mock te verifiëren, kan dit worden gedaan in de "dan" fase met should() of should(VerificationMode) (alleen sinds 1.10.5) methoden:

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

Wanneer het gewenst is om te verifiëren dat er geen interacties meer waren met een mock naast al geverifieerd, kan dit worden gedaan in de "dan" -fase met shouldHaveNoMoreInteractions() (sinds 2.0.0):

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

Wanneer het gewenst is om te verifiëren dat er absoluut geen interacties met een mock waren, kan dit in de "dan" -fase worden gedaan met shouldHaveNoMoreInteractions() (sinds 2.0.0):

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

Wanneer het gewenst is om te controleren of methoden zijn aangeroepen , kan dit in de "dan" -fase worden gedaan met should(InOrder) (sinds 1.10.5) en should(InOrder, VerificationMode) (sinds 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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow