ErrorCollector.checkThat nunca falha no JUnit Jupiter

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?

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

1 curtida

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>

Tente adicionar depois dos assertThats:

softAssertions.assertAll();

E instancie o SoftAssertions dentro do teste.

1 curtida

@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.

1 curtida

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!

1 curtida

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

Ai sim, seria.

1 curtida