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
}
}
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 assertThat
s:
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?