Creare il Vostro Coltellino svizzero sulla pila di test Java

La testabilità del codice garantisce diversi punti di eccellenza in un progetto di codice efficiente, come la manutenibilità; aiuta con la documentazione e rende più semplice rifattorizzare e costruire un design/architettura evolutivo. Non c’è dubbio al riguardo, ma qual è una buona pila di test con cui iniziare un progetto? Questo video spiegherà la pila di test minima per iniziare il tuo progetto con Java.

Il primo punto da capire quando parliamo di minimo è che non ci sono proiettili d’argento nella pila di test. Alla fine, dobbiamo includere o rimuovere dipendenze, specialmente quando parliamo di codice legacy. Considerato questo, suggerirò qual è la mia pila di test preferita in Java, che uso e raccomando come minimo per iniziare da zero:

  • JUnit-Jupiter: La quinta versione di JUnit rompe la compatibilità con la versione precedente; tuttavia, ne vale la pena perché introduce diverse funzionalità, principalmente per creare estensioni personalizzate.

  • Mockito: Un framework di mock super popolare con Java. Questa popolarità e una vasta community consentono diverse estensioni, come quelle con JUnit-Jupiter.

  • AssertJ: Se ami le API fluide come me, allora, AssertJ è una libreria fuori dal comune per te.

Utilizzando il progetto Maven, puoi aggiungere le dipendenze di queste librerie:

XML

 

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-engine</artifactId>
    <version>${junit.version}</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-params</artifactId>
    <version>${junit.version}</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <version>${mockito.verson}</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-junit-jupiter</artifactId>
    <version>${mockito.verson}</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.assertj</groupId>
    <artifactId>assertj-core</artifactId>
    <version>${assertj.verson}</version>
    <scope>test</scope>
</dependency>

Dato un contesto di campionato di calcio, dove abbiamo una squadra che dovrebbe avere undici giocatori, ogni nome deve essere unico nel campionato. Possiamo esplorare test su di esso.

Iniziando con JMockito e test, abbiamo bisogno di testare il servizio in cui dobbiamo verificare se il nome esiste nel database per procedere con la logica. A questo punto, non ne abbiamo bisogno e non vogliamo creare un test di integrazione. 

Vogliamo concentrarsi sull’azienda, quindi non vogliamo testare il database o il framework ma solo il mio codice. Quindi, mokeremo il repository con due scenari, quando c’è il nome e quando non c’è.

Utilizzando Mockito integrato con JUnit-Jupiter puoi iniettare mock solo utilizzando annotazioni. Il codice seguente mostra il test utilizzando JMockito, dove non abbiamo bisogno di avere un database o uscire dall’obiettivo per testare l’azienda.

Java

 

@ExtendWith(MockitoExtension.class)
class ChampionshipServiceTest {

    @Mock
    private ChampionRepository repository;

    @InjectMocks
    private ChampionshipService service;

    @Test
    public void shouldRegister() {
        Mockito.when(repository.existByName("Bahia")).thenReturn(false);
        Team bahia = Team.of("Bahia");
        service.register(bahia);

        Mockito.verify(repository).existByName("Bahia");
    }
    @Test
    @DisplayName("should return an exception when there is a team with a name")
    public void shouldThrownAnExceptionWhenTeamNameExists() {
        Mockito.when(repository.existByName("Bahia")).thenReturn(true);
        Team bahia = Team.of("Bahia");
        Assertions.assertThrows(IllegalArgumentException.class, () ->
                service.register(bahia));

        Mockito.verify(repository).existByName("Bahia");
    }
}

AssertJ rende le asserzioni più facili da comprendere, grazie all’API fluente che la libreria supporta. Puoi testare raccolte, mappe o un’istanza singola. Ad esempio, possiamo verificare l’aggiunta di un giocatore alla squadra utilizzando questa libreria.

Java

 

@Test
public void shouldCreatePlayers() {
    Team bahia = Team.of("Bahia");
    bahia.add(Player.of("Neymar", "Santos", 10));
    bahia.add(Player.of("Cristiano Ronaldo", "Lisbon", 10));

    org.assertj.core.api.Assertions.assertThat(bahia.players())
            .hasSize(2)
            .map(Player::name)
            .contains("Neymar", "Cristiano Ronaldo");
}

Dai un’occhiata a questo video per ulteriori informazioni.

Punti salienti:

  • A minimum test stack to start Java

  • Scopri di più su JUnit e perché è una buona scelta

  • Impara a conoscere i mock esplorando con JMockito

  • Rendi il tuo test bellissimo con l’API fluente Assert: AssertJ

Source:
https://dzone.com/articles/creating-your-swiss-army-knife-on-java-test-stack