Como agrupar asserts no JUnit

wldomiciano

Wellington Domiciano

Posted on March 16, 2022

Como agrupar asserts no JUnit

Pode haver momentos em que precisamos usar múltiplos asserts em um mesmo teste. Independente se você considera certo ou errado, afinal não estamos aqui para julgar, eu gostaria de apresentar uma forma de lidar melhor com estes asserts agrupando-os através do método assertAll().

No código abaixo eu tenho 2 testes, cada um com 2 asserts que falham. No primeiro eu usei asserts individuais enquanto no segundo eu os agrupei.

import static org.junit.jupiter.api.Assertions.assertAll;
import static org.junit.jupiter.api.Assertions.fail;

import org.junit.jupiter.api.Test;

class AppTest {
  @Test
  void usingIndividualAsserts() {
    fail("Test 1, assert 1");
    fail("Test 1, assert 2");
  }

  @Test
  void usingGroupedAsserts() {
    assertAll(
      () -> fail("Test 2, assert 1"),
      () -> fail("Test 2, assert 2")
    );
  }
}
Enter fullscreen mode Exit fullscreen mode

Meu build.gradle.kts está assim (estou usando Gradle 8.4):

plugins {
  java
}

repositories {
  mavenCentral()
}

dependencies {
  testImplementation(platform("org.junit:junit-bom:5.10.0"))
  testImplementation("org.junit.jupiter:junit-jupiter")
}

tasks.test {
  useJUnitPlatform()

  testLogging {
    showExceptions = true
    showCauses = false
    showStackTraces = false
    exceptionFormat = org.gradle.api.tasks.testing.logging.TestExceptionFormat.FULL
  }
}
Enter fullscreen mode Exit fullscreen mode

E esta é a estrutura do meu projeto de teste:

project
├── build.gradle
└── src
    └── test
        └── java
            └── AppTest.java
Enter fullscreen mode Exit fullscreen mode

A princípio ambos os testes rodam da mesma forma, porém, veja a saída no console quando eu executo o comando gradle test:

AppTest > usingIndividualAsserts() FAILED
    org.opentest4j.AssertionFailedError: Test 1, assert 1

AppTest > usingGroupedAsserts() FAILED
    org.gradle.internal.exceptions.DefaultMultiCauseException: Multiple Failures (2 failures)
        org.opentest4j.AssertionFailedError: Test 2, assert 1
        org.opentest4j.AssertionFailedError: Test 2, assert 2
Enter fullscreen mode Exit fullscreen mode

Veja como no primeiro teste apenas a primeira falha é reportada. Na verdade, ele nem chega a executar o segundo assert, pois o teste é interrompido imediatamente.

Já no segundo teste as 2 falhas são reportadas nos dando a visão completa do que deu errado logo de cara.

Por isso, se vai usar vários asserts num mesmo teste, não deixe de agrupá-los, beleza?

💖 💪 🙅 🚩
wldomiciano
Wellington Domiciano

Posted on March 16, 2022

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related

Como agrupar asserts no JUnit
braziliandevs Como agrupar asserts no JUnit

March 16, 2022