JUnit et Mockito

Exemple de test de service web utilisant JUnit couplé à Mockito

package fr.dyma;

import fr.dyma.exception.InvalidClientDetailsException;
import fr.dyma.repository.ClientRepository;
import fr.dyma.sevice.ClientDetailsService;
import fr.dyma.sevice.impl.ClientDetailsServiceImpl;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.mockito.junit.jupiter.MockitoExtension;

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;

@ExtendWith(MockitoExtension.class) // Permettre à JUnit d'étendre la librairie Mockito
public class ClientDetailsServiceTest {
    @Mock // Mocker la classe ClientRepository
    ClientRepository clientRepo;

    // Injecter dans ClientDetailsService les mocks définis dans la classe de test ClientDetailsServiceTest
    // Ex ici, le mock à injecter est clientRepo
    @InjectMocks
    static ClientDetailsService clientDetailsService = new ClientDetailsServiceImpl();;

    @BeforeEach
    public void init() {
        // Demander à Mockito d'initialier automatiquement les mocks
        // et d'instancier un nouveau mock à chaque test afin d'éviter les effets de bord
        MockitoAnnotations.openMocks(this);
    }

    /**
     * Testing getClientDetail method for ClientDetailsService class
     * This method calls clientRepository which is mocked and should return a valid client
     * @throws InvalidClientDetailsException Custom Exception class for ClientDetailsService
     */
    @Test
    public void getClientDetails_should_return_client() throws InvalidClientDetailsException {
        Integer clientId = 1;
        Client client = new Client(clientId, "Tuan", "tuan@gmail.com");

        // Mockito.when() pertmet de définir le comportement des méthodes des Mocks et de ne pas exécuter
        // les méthodes du code en prod. afin d'avoir un résultat prédéfini de notre mock
        Mockito.when(clientRepo.getClient(clientId)).thenReturn(client);

        Client clientDetails = clientDetailsService.getClientDetails(clientId);
        assertThat(clientDetails).isEqualTo(client);
    }

    /**
     * Testing getClientDetail method for ClientDetailsService class
     * This method calls clientRepository which is mocked and should return an invalid client
     * because client name is blank
     * @throws InvalidClientDetailsException Custom Exception class for ClientDetailsService
     */
    @Test
    public void getClientDetails_should_throw_exception_when_client_name_is_blank() {
        Integer clientId = 1;
        Client client = new Client(clientId, "", "tuan@gmail.com");
        Mockito.when(clientRepo.getClient(clientId)).thenReturn(client);

        assertThatThrownBy(() -> {
            clientDetailsService.getClientDetails(clientId);
        })
                .isInstanceOf(InvalidClientDetailsException.class)
                .hasMessage("Client name is blank");
    }
}
Langage du code : JavaScript (javascript)