Les proves unitàries són una part fonamental del desenvolupament de programari, ja que permeten verificar que les unitats individuals de codi funcionen com s'espera. JUnit és un dels marcs de proves més populars per a Java, i s'integra perfectament amb Spring Boot per facilitar la creació i execució de proves unitàries.
Objectius del tema
- Entendre què són les proves unitàries i per què són importants.
- Aprendre a configurar JUnit en un projecte Spring Boot.
- Escriure i executar proves unitàries bàsiques amb JUnit.
- Utilitzar anotacions de JUnit per gestionar el cicle de vida de les proves.
- Comprendre com utilitzar Mockito per simular dependències en les proves.
Què són les proves unitàries?
Les proves unitàries són proves automàtiques que verifiquen el funcionament d'una unitat de codi, com ara una funció o un mètode. L'objectiu és assegurar-se que cada unitat de codi funcioni correctament de manera aïllada.
Beneficis de les proves unitàries
- Detecció primerenca d'errors: Les proves unitàries permeten detectar errors en una fase primerenca del desenvolupament.
- Facilitat de manteniment: Les proves unitàries ajuden a assegurar que els canvis en el codi no introdueixin nous errors.
- Documentació: Les proves unitàries poden servir com a documentació del comportament esperat del codi.
Configuració de JUnit en un projecte Spring Boot
Spring Boot ve amb suport integrat per a JUnit. Per començar a utilitzar JUnit, assegura't que el teu projecte tingui les següents dependències en el fitxer pom.xml
(per a Maven) o build.gradle
(per a Gradle).
Maven
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
Gradle
Escriure una prova unitària bàsica amb JUnit
A continuació, veurem com escriure una prova unitària bàsica per a un servei de Spring Boot.
Exemple de servei
Suposem que tenim un servei senzill que calcula la suma de dos nombres.
Prova unitària per al servei
Crearem una prova unitària per verificar que el mètode add
funciona correctament.
@RunWith(SpringRunner.class) @SpringBootTest public class CalculatorServiceTest { @Autowired private CalculatorService calculatorService; @Test public void testAdd() { int result = calculatorService.add(2, 3); assertEquals(5, result); } }
Explicació del codi
@RunWith(SpringRunner.class)
: Indica que la classe de prova utilitza SpringRunner per executar les proves.@SpringBootTest
: Carrega el context de l'aplicació de Spring Boot per a les proves.@Autowired
: Injecta elCalculatorService
en la classe de prova.@Test
: Marca el mètodetestAdd
com una prova unitària.assertEquals(5, result)
: Verifica que el resultat decalculatorService.add(2, 3)
sigui 5.
Utilitzant Mockito per simular dependències
Mockito és una biblioteca popular per a la simulació de dependències en proves unitàries. A continuació, veurem com utilitzar Mockito per simular una dependència en una prova unitària.
Exemple de servei amb dependència
Suposem que el nostre servei de calculadora depèn d'un altre servei per obtenir un valor inicial.
@Service public class CalculatorService { @Autowired private InitialValueService initialValueService; public int add(int a, int b) { return a + b + initialValueService.getInitialValue(); } }
Prova unitària amb Mockito
Crearem una prova unitària que simuli el InitialValueService
.
@RunWith(SpringRunner.class) @SpringBootTest public class CalculatorServiceTest { @MockBean private InitialValueService initialValueService; @Autowired private CalculatorService calculatorService; @Test public void testAdd() { Mockito.when(initialValueService.getInitialValue()).thenReturn(10); int result = calculatorService.add(2, 3); assertEquals(15, result); } }
Explicació del codi
@MockBean
: Crea una simulació deInitialValueService
i l'injecta en el context de Spring.Mockito.when(initialValueService.getInitialValue()).thenReturn(10)
: Configura la simulació perquègetInitialValue
retorni 10.assertEquals(15, result)
: Verifica que el resultat decalculatorService.add(2, 3)
sigui 15, tenint en compte el valor inicial simulat.
Exercicis pràctics
Exercici 1: Escriure una prova unitària per a un mètode de resta
- Crea un mètode
subtract
en elCalculatorService
que resti dos nombres. - Escriu una prova unitària per verificar que el mètode
subtract
funciona correctament.
Exercici 2: Simular una dependència en una prova unitària
- Afegeix una nova dependència al
CalculatorService
que multipliqui el resultat per un factor. - Utilitza Mockito per simular aquesta nova dependència en una prova unitària.
Solucions
Solució a l'exercici 1
Mètode subtract
en el CalculatorService
Prova unitària per al mètode subtract
@Test public void testSubtract() { int result = calculatorService.subtract(5, 3); assertEquals(2, result); }
Solució a l'exercici 2
Nova dependència en el CalculatorService
@Service public class CalculatorService { @Autowired private InitialValueService initialValueService; @Autowired private MultiplicationFactorService multiplicationFactorService; public int add(int a, int b) { return (a + b + initialValueService.getInitialValue()) * multiplicationFactorService.getFactor(); } }
Prova unitària amb Mockito per a la nova dependència
@RunWith(SpringRunner.class) @SpringBootTest public class CalculatorServiceTest { @MockBean private InitialValueService initialValueService; @MockBean private MultiplicationFactorService multiplicationFactorService; @Autowired private CalculatorService calculatorService; @Test public void testAddWithMultiplicationFactor() { Mockito.when(initialValueService.getInitialValue()).thenReturn(10); Mockito.when(multiplicationFactorService.getFactor()).thenReturn(2); int result = calculatorService.add(2, 3); assertEquals(30, result); // (2 + 3 + 10) * 2 = 30 } }
Conclusió
En aquesta secció, hem après què són les proves unitàries i com utilitzar JUnit per escriure i executar proves unitàries en un projecte Spring Boot. També hem vist com utilitzar Mockito per simular dependències en les proves. Les proves unitàries són una eina poderosa per assegurar la qualitat del codi i facilitar el manteniment del projecte. En el següent tema, explorarem les proves d'integració per verificar el funcionament conjunt de diverses unitats de codi.
Curs de Spring Boot
Mòdul 1: Introducció a Spring Boot
- Què és Spring Boot?
- Configuració del teu entorn de desenvolupament
- Creant la teva primera aplicació Spring Boot
- Entenent l'estructura del projecte Spring Boot
Mòdul 2: Conceptes bàsics de Spring Boot
- Anotacions de Spring Boot
- Injecció de dependències a Spring Boot
- Configuració de Spring Boot
- Propietats de Spring Boot
Mòdul 3: Construint serveis web RESTful
- Introducció als serveis web RESTful
- Creant controladors REST
- Gestionant mètodes HTTP
- Gestió d'excepcions en REST
Mòdul 4: Accés a dades amb Spring Boot
- Introducció a Spring Data JPA
- Configuració de fonts de dades
- Creant entitats JPA
- Utilitzant repositoris de Spring Data
- Mètodes de consulta a Spring Data JPA
Mòdul 5: Seguretat a Spring Boot
- Introducció a Spring Security
- Configuració de Spring Security
- Autenticació i autorització d'usuaris
- Implementant autenticació JWT
Mòdul 6: Proves a Spring Boot
Mòdul 7: Funcions avançades de Spring Boot
Mòdul 8: Desplegant aplicacions Spring Boot
Mòdul 9: Rendiment i monitorització
- Optimització del rendiment
- Monitorització amb Spring Boot Actuator
- Utilitzant Prometheus i Grafana
- Gestió de registres i logs