Les assertions personalitzades són una eina poderosa que permet als desenvolupadors crear les seves pròpies verificacions específiques per a les necessitats del seu projecte. Aquestes assertions poden simplificar el codi de test i fer-lo més llegible i mantenible.
Per què utilitzar assertions personalitzades?
- Reutilització de codi: Les assertions personalitzades permeten encapsular la lògica de verificació complexa en una sola funció, que es pot reutilitzar en múltiples tests.
- Millora de la llegibilitat: Les assertions personalitzades poden fer que els tests siguin més fàcils de llegir i entendre, ja que encapsulen la lògica de verificació en noms de mètodes significatius.
- Mantenibilitat: Si la lògica de verificació canvia, només cal actualitzar l'assertion personalitzada en un sol lloc.
Creació d'Assertions Personalitzades
Pas 1: Crear una Classe d'Assertions
Primer, crearem una classe d'assertions personalitzades. Aquesta classe contindrà els mètodes d'assertion que encapsulen la lògica de verificació específica.
public class CustomAssertions { public static void assertIsPositive(int number) { if (number <= 0) { throw new AssertionError("Expected a positive number, but got: " + number); } } public static void assertIsEven(int number) { if (number % 2 != 0) { throw new AssertionError("Expected an even number, but got: " + number); } } }
Pas 2: Utilitzar les Assertions Personalitzades en els Tests
Ara que tenim la nostra classe d'assertions personalitzades, podem utilitzar aquests mètodes en els nostres tests.
import org.junit.jupiter.api.Test; public class CustomAssertionsTest { @Test public void testPositiveNumber() { int number = 5; CustomAssertions.assertIsPositive(number); } @Test public void testEvenNumber() { int number = 4; CustomAssertions.assertIsEven(number); } @Test public void testNegativeNumber() { int number = -3; CustomAssertions.assertIsPositive(number); // Aquest test fallarà } @Test public void testOddNumber() { int number = 3; CustomAssertions.assertIsEven(number); // Aquest test fallarà } }
Pas 3: Afegir Missatges d'Error Descriptius
És important proporcionar missatges d'error descriptius per facilitar la depuració quan un test falla. Ja hem afegit missatges d'error en els nostres mètodes d'assertion personalitzats.
Pas 4: Assertions Personalitzades amb Objectes Complexos
Les assertions personalitzades també poden ser útils per verificar objectes complexos. Per exemple, si tenim una classe Person
i volem verificar que dues instàncies de Person
són iguals basant-nos en certs atributs, podem crear una assertion personalitzada per a això.
public class Person { private String name; private int age; // Constructor, getters, and setters } public class CustomAssertions { public static void assertPersonEquals(Person expected, Person actual) { if (!expected.getName().equals(actual.getName())) { throw new AssertionError("Expected name: " + expected.getName() + ", but got: " + actual.getName()); } if (expected.getAge() != actual.getAge()) { throw new AssertionError("Expected age: " + expected.getAge() + ", but got: " + actual.getAge()); } } }
Exemple d'ús amb Objectes Complexos
import org.junit.jupiter.api.Test; public class CustomAssertionsTest { @Test public void testPersonEquality() { Person expected = new Person("John", 30); Person actual = new Person("John", 30); CustomAssertions.assertPersonEquals(expected, actual); } @Test public void testPersonInequality() { Person expected = new Person("John", 30); Person actual = new Person("Jane", 25); CustomAssertions.assertPersonEquals(expected, actual); // Aquest test fallarà } }
Exercicis Pràctics
Exercici 1: Crear una Assertion Personalitzada per Verificar Strings
Crea una assertion personalitzada que verifiqui si una cadena de text conté una subcadena específica.
public class CustomAssertions { public static void assertStringContains(String str, String substring) { if (!str.contains(substring)) { throw new AssertionError("Expected string to contain: " + substring + ", but got: " + str); } } }
Exercici 2: Utilitzar la Nova Assertion en un Test
import org.junit.jupiter.api.Test; public class CustomAssertionsTest { @Test public void testStringContains() { String str = "Hello, world!"; CustomAssertions.assertStringContains(str, "world"); } @Test public void testStringDoesNotContain() { String str = "Hello, world!"; CustomAssertions.assertStringContains(str, "JUnit"); // Aquest test fallarà } }
Conclusió
Les assertions personalitzades són una eina valuosa per millorar la llegibilitat, la reutilització i la mantenibilitat dels tests. En encapsular la lògica de verificació en mètodes significatius, podem fer que els nostres tests siguin més clars i fàcils de mantenir. Practica creant les teves pròpies assertions personalitzades per adaptar-les a les necessitats específiques del teu projecte.
Curs de JUnit
Mòdul 1: Introducció a JUnit
Mòdul 2: Anotacions Bàsiques de JUnit
- Entenent @Test
- Utilitzant @Before i @After
- Utilitzant @BeforeClass i @AfterClass
- Ignorant Tests amb @Ignore
Mòdul 3: Assertions a JUnit
Mòdul 4: Tests Parametritzats
- Introducció als Tests Parametritzats
- Creant Tests Parametritzats
- Utilitzant @ParameterizedTest
- Tests Parametritzats Personalitzats
Mòdul 5: Suites de Test
Mòdul 6: Mocking amb JUnit
Mòdul 7: Funcions Avançades de JUnit
Mòdul 8: Millors Pràctiques i Consells
- Escrivint Tests Efectius
- Organitzant el Codi de Test
- Desenvolupament Guiat per Tests (TDD)
- Integració Contínua amb JUnit