6.1 affirme

Les assertions sont des vérifications spéciales qui peuvent être insérées à différents endroits dans le code. Leur tâche est de déterminer que quelque chose s'est mal passé. Ou plutôt, pour vérifier que tout se passe comme il se doit. C'est "au besoin" et ils vous permettent de le définir de différentes manières.

Vous avez déjà rencontré des assertions dans le code ci-dessus. La première consiste à vérifier l'égalité des objets. Si les objets ne sont pas égaux, une exception sera levée et le test échouera.

L'ordre de comparaison est important ici , car JUnit dans le rapport final écrira quelque chose comme "valeur 1 reçue, mais 3 était attendue". Le format général d'un tel chèque est le suivant :

assertEquals(standard , meaning)

Exemple:

@Test
public void whenAssertingEquality () {
    String expected = "3.1415";
    String actual = "3";

    assertEquals(expected, actual);
}

6.2 Méthodes assertEquals, assertTrue, assertFalse

Ci-dessous, je vais énumérer les méthodes les plus populaires - les assertions. Par leurs noms, il est tout à fait possible de deviner comment ils fonctionnent. Mais je vais quand même écrire une petite explication :

assertEquals Vérifie que deux objets sont égaux
assertArrayEquals Vérifie si deux tableaux contiennent des valeurs égales
assertNotNull Vérifie si l'argument n'est pas nul
assertNull Vérifie si l'argument est nul
assertNotSame Vérifier que les deux arguments ne sont pas le même objet
assertSame Vérifier que les deux arguments sont le même objet
assertTrue Vérifie si l'argument est vrai
assertFalse Vérifie si l'argument est faux

Certaines de ces méthodes semblent redondantes. Pourquoi utiliser assertSame(a, b) alors que vous pouvez simplement écrire assertTrue(a == b) ?

Le fait est que assert est une méthode très intelligente. Il fait beaucoup de choses utiles, y compris l'écriture d'informations d'erreur dans le journal . Dans le premier cas, il écrira que l'objet A était attendu, mais qu'il a reçu l'objet B. Dans le second cas, il écrira simplement que vrai était attendu .

Lorsque vous avez des centaines de tests, en particulier ceux qui s'exécutent sur un serveur de test dédié, disposer de journaux détaillés peut être extrêmement utile. Je pense que vous comprenez ce que je veux dire.

Exemple de comparaison de tableaux :

@Test
public void whenAssertingArraysEquality() {
    char[] expected = {'J','u','n','i','t'};
    char[] actual = "Junit".toCharArray();

    assertArrayEquals(expected, actual);
}

6.3 méthode assertAll

Comme mentionné ci-dessus, la méthode assert effectue non seulement une vérification, mais écrit également de nombreuses informations sur des objets comparables dans le journal.

Faisons une comparaison :

Address address = unitUnderTest.methodUnderTest();
assertEquals("Washington", address.getCity());
assertEquals("Oracle Parkway", address.getStreet());
assertEquals("500", address.getNumber());

Mais si l'un des paramètres ne correspond pas, le reste ne sera pas vérifié. Mais je voudrais qu'ils se produisent encore et que leurs résultats soient enregistrés dans le journal. Mais en même temps, si au moins une vérification échoue, le test échoue toujours.

Il existe une méthode spéciale pour cela - assertAll() . Comme premier argument, il faut un commentaire à écrire dans le journal, puis un nombre quelconque de fonctions d'assertion.

Voici comment notre exemple serait réécrit avec :

Address address = unitUnderTest.methodUnderTest();
assertAll("Complex address comparison script",
    () -> assertEquals("Washington", address.getCity()),
    () -> assertEquals("Oracle Parkway", address.getStreet()),
    () -> assertEquals("500", address.getNumber())
);

Ensuite, si l'adresse est incorrecte, quelque chose comme ceci sera écrit dans le journal :

	Complex scenario comparison address (3 failures)
	expected: <Washington> but was: <Seattle>
    expected: <Oracle Parkway> but was: <Main Street>
    expected: <500> but was: <5772>

6.4 Méthode assertTimeout

Vous vous souvenez de l' annotation @Timeout ? Cela permettait de contrôler le temps d'exécution de l'ensemble de la méthode. Mais parfois, il est utile de définir des restrictions sur l'exécution d'une partie du code à l'intérieur de la méthode. Vous pouvez utiliser assertTimeout() pour cela .

L'heure est passée en premier paramètre, et le code (fonction) qui doit être exécuté dans le temps spécifié est passé en second. Exemple:

@Test
public void whenAssertingTimeout() {
    assertTimeout(
  	ofSeconds(2),
  	() -> {
    	// pause for one second
    	Thread.sleep(1000);
  	}
	);
}

La classe Assert a 12 variantes de la méthode assertTimeout() . Si vous souhaitez en savoir plus à leur sujet, bienvenue dans la documentation officielle .

6.5 méthode assertThrows

Très souvent, il y a des situations où vous devez vous assurer que dans une certaine situation, le code lève la bonne exception : il détecte une erreur et lève la bonne exception. C'est une situation très courante.

Dans ce cas, il existe une autre méthode assert utile - c'est assertThrows() . Le format général de son appel est :

assertThrows(exception , code)

Fondamentalement, il est très similaire à la méthode assertTimeout() , sauf qu'il vérifie que le code spécifié lève la bonne exception. Exemple:

@Test
void whenAssertingException() {
    Throwable exception = assertThrows(
  	IllegalArgumentException.class,
  	() -> {
      	throw new IllegalArgumentException("Exception message");
  	}
    );
    assertEquals("Exception message", exception.getMessage());
}