ErrorCollector.checkThat nunca falha no JUnit Jupiter

7 respostas Resolvido
back-endjunitjavaprogramação
wanderley.drumond

Olá pessoal, tenho um teste que é suposto falhar. Mas eu se eu utilizar rules ele passa sempre.

Ei-lo:

package br.ce.wcaquino.servicos;

import br.ce.wcaquino.entidades.Filme;
import br.ce.wcaquino.entidades.Locacao;
import br.ce.wcaquino.entidades.Usuario;
import org.hamcrest.MatcherAssert;
import org.junit.Rule;
import org.junit.jupiter.api.Test;
import org.junit.rules.ErrorCollector;

import java.util.Date;

import static br.ce.wcaquino.utils.DataUtils.isMesmaData;
import static br.ce.wcaquino.utils.DataUtils.obterDataComDiferencaDias;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;

class LocacaoServiceTest {

    @Rule
    public ErrorCollector errorCollector = new ErrorCollector();

    @Test
    void main() {
//        Given
        Usuario usuario = new Usuario("Wanderley");
        Filme filme = new Filme("Mother", 1, 5.);
        LocacaoService locacaoService = new LocacaoService();

//		When
        Locacao locacao = locacaoService.alugarFilme(usuario, filme);

//		Then
// Estes testes sempre passam
        errorCollector.checkThat(locacao.getValor(), is(equalTo(6.))); 
        errorCollector.checkThat(isMesmaData(locacao.getDataLocacao(), new Date()), is(false)); 
        errorCollector.checkThat(isMesmaData(locacao.getDataRetorno(), obterDataComDiferencaDias(2)), is(true)); 

// Aqui os testes falham sem problemas
        MatcherAssert.assertThat(locacao.getValor(), is(equalTo(6.))); 
        MatcherAssert.assertThat(isMesmaData(locacao.getDataLocacao(), new Date()), is(false)); 
        MatcherAssert.assertThat(isMesmaData(locacao.getDataRetorno(), obterDataComDiferencaDias(2)), is(true));
    }
}

Eu tenho a dependência dele no meu pom.xml

<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-migrationsupport -->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-migrationsupport</artifactId>
            <version>5.8.2</version>
            <scope>test</scope>
        </dependency>

Já não sei mais o que pode ser. Olhei a documentação do JUnit e lá diz que as funcionalidades das rules são limitadas, mas ainda funcionais. Daí a necessidade de se inserir esta dependência, uma vez que ela não é mais nativa do JUnit desde a versão 5.

Alguém tem uma ideia do que pode ser?

7 Respostas

Lucas_Camara
Solucao aceita

E se vc usar o AssertJ para fazer isso? (ele funcionar perfeitamente com JUnit5)

Test

@Test
 public void host_dinner_party_where_nobody_dies() {
   Mansion mansion = new Mansion();
   mansion.hostPotentiallyMurderousDinnerParty();
   SoftAssertions softly = new SoftAssertions();
   softly.assertThat(mansion.guests()).as("Living Guests").isEqualTo(7);
   softly.assertThat(mansion.kitchen()).as("Kitchen").isEqualTo("clean");
   softly.assertThat(mansion.library()).as("Library").isEqualTo("clean");
   softly.assertThat(mansion.revolverAmmo()).as("Revolver Ammo").isEqualTo(6);
   softly.assertThat(mansion.candlestick()).as("Candlestick").isEqualTo("pristine");
   softly.assertThat(mansion.colonel()).as("Colonel").isEqualTo("well kempt");
   softly.assertThat(mansion.professor()).as("Professor").isEqualTo("well kempt");
   softly.assertAll();
 }

Resultado

org.assertj.core.api.SoftAssertionError: The following 4 assertions failed:
 1) [Living Guests] expected:<[7]> but was:<[6]>
 2) [Library] expected:<'[clean]'> but was:<'[messy]'>
 3) [Candlestick] expected:<'[pristine]'> but was:<'[bent]'>
 4) [Professor] expected:<'[well kempt]'> but was:<'[bloodied and disheveled]'>

FONTE: SoftAssertions - assertj-core 3.22.0 javadoc

wanderley.drumond

Tentei utilizar mas sem sucesso, não sei se estou fazendo alguma coisa de errado mas a situação persiste.

package br.ce.wcaquino.servicos;

import br.ce.wcaquino.entidades.Filme;
import br.ce.wcaquino.entidades.Locacao;
import br.ce.wcaquino.entidades.Usuario;
import org.assertj.core.api.SoftAssertions;
import org.junit.jupiter.api.Test;

import java.util.Date;

import static br.ce.wcaquino.utils.DataUtils.isMesmaData;
import static br.ce.wcaquino.utils.DataUtils.obterDataComDiferencaDias;

class LocacaoServiceTest {

    SoftAssertions softAssertions = new SoftAssertions();

    @Test
    void main() {
//        Given
        Usuario usuario = new Usuario("Wanderley");
        Filme filme = new Filme("Mother", 1, 5.);
        LocacaoService locacaoService = new LocacaoService();

//		When
        Locacao locacao = locacaoService.alugarFilme(usuario, filme);

//		Then
        softAssertions.assertThat(locacao.getValor()).as("Preço da locação").isEqualTo(7); // O Valor correto é cinco
        softAssertions.assertThat(locacao.getDataLocacao()).as("Data da locação").isEqualTo(new Date(0L)); // Eu pus a primeira data possível do objeto date
        softAssertions.assertThat(isMesmaData(locacao.getDataRetorno(), obterDataComDiferencaDias(1))).isEqualTo(false); // Esta expressão lógica retorna true. Eu pus false propositalmente
    }
}

idea64_4jcPOIxaSz

Adicionei a dependência ao pom.xml corretamente:

<!-- https://mvnrepository.com/artifact/org.assertj/assertj-core -->
        <dependency>
            <groupId>org.assertj</groupId>
            <artifactId>assertj-core</artifactId>
            <version>3.22.0</version>
            <scope>test</scope>
        </dependency>
Lucas_Camara

Tente adicionar depois dos assertThats:

softAssertions.assertAll();

E instancie o SoftAssertions dentro do teste.

wanderley.drumond

@Lucas_Camara mais uma vez obrigado. Era isso mesmo.

No entanto, não há necessidade de instanciar o objeto dentro do teste. posso utilizá-lo como um atributo da própria classe que funciona sem problemas.

Era só o softAssertions.assertAll(); que estava faltando mesmo.

Lucas_Camara

Comentei sobre a criação da instancia dentro do método, pq pode afetar outros possíveis testes na mesma classe caso fosse usado em um outro teste. Mas que bom que deu certo!

wanderley.drumond

Não seria uma boa prática inserir a instanciação no beforeEach?

Lucas_Camara

Ai sim, seria.

Criado 6 de março de 2022
Ultima resposta 7 de mar. de 2022
Respostas 7
Participantes 2