DEV Community

Wellington Domiciano
Wellington Domiciano

Posted on • Edited on • Originally published at wldomiciano.com

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?

Top comments (2)

Collapse
 
gabrielsantosba profile image
Gabriel Bahia.

Muito prático e interessante, vou colocar em prática esse tipo de agrupamento.

Collapse
 
wldomiciano profile image
Wellington Domiciano

Obrigado pelo feedback, Gabriel!