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
