I got the following class with which I want to test my repository:
package de.gabriel.vertretungsplan.repositories;
import de.gabriel.vertretungsplan.models.Fach;
import de.gabriel.vertretungsplan.models.Klasse;
import de.gabriel.vertretungsplan.models.StundenplanEintrag;
import de.gabriel.vertretungsplan.models.Tag;
import de.gabriel.vertretungsplan.models.enums.Anwesenheit;
import de.gabriel.vertretungsplan.models.enums.Rolle;
import de.gabriel.vertretungsplan.models.enums.Tage;
import de.gabriel.vertretungsplan.models.users.Lehrer;
import org.junit.jupiter.api.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.test.context.ActiveProfiles;
import java.util.List;
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
@DataJpaTest
@ActiveProfiles("test")
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
class StundenplanEintragRepositoryTest {
@Autowired
private StundenplanEintragRepository stundenplanEintragRepository;
@Autowired
private KlasseRepository klasseRepository;
@Autowired
private FachRepository fachRepository;
@Autowired
private LehrerRepository lehrerRepository;
@Autowired
private TagRepository tagRepository;
private Lehrer deutschLehrer;
private Tag montag;
private StundenplanEintrag stundenplanEintragReference;
@BeforeAll
void init() {
Klasse klasse6a = new Klasse("6a");
klasseRepository.saveAll(List.of(
klasse6a
));
Fach deutsch = new Fach("Deutsch", "DE");
fachRepository.saveAll(List.of(
deutsch
));
deutschLehrer = new Lehrer("deutschLehrer", "deutschLehrer", Rolle.getPrefixedRolle(Rolle.LEHRER), Anwesenheit.ANWESEND);
deutschLehrer.setFaecher(List.of(deutsch));
lehrerRepository.saveAll(List.of(
deutschLehrer
));
montag = new Tag(Tage.MONTAG);
tagRepository.saveAll(List.of(
montag
));
stundenplanEintragReference = new StundenplanEintrag(1, klasse6a, deutsch, deutschLehrer, montag);
stundenplanEintragRepository.saveAll(List.of(
stundenplanEintragReference
));
}
@AfterAll
void tearDown() {
stundenplanEintragRepository.deleteAll();
}
@Test
@DisplayName("Check if correct Stundenplan Eintrag is returned given Lehrer [deutschLehrer] and Tag [montag]")
void findByLehrerAndTag() {
List<StundenplanEintrag> stundenplanEintrag = stundenplanEintragRepository.findByLehrerAndTag(deutschLehrer, montag);
assertThat(stundenplanEintrag.get(0).getId()).isEqualTo(stundenplanEintragReference.getId());
}
@Test
@DisplayName("Check if correct Stundenplan Eintrag is returned given Lehrer [deutschLehrer]")
void findByLehrer() {
List<StundenplanEintrag> stundenplanEintrag = stundenplanEintragRepository.findByLehrer(deutschLehrer);
assertThat(stundenplanEintrag.get(0).getLehrer().getUsername()).isEqualTo(deutschLehrer.getUsername());
}
}
As you can see currently I am comparing the result from the repository by a single field with the reference object (like the id
or username
), because if I compare them like this:
@Test
@DisplayName("Check if correct Stundenplan Eintrag is returned given Lehrer [deutschLehrer] and Tag [montag]")
void findByLehrerAndTag() {
List<StundenplanEintrag> stundenplanEintrag = stundenplanEintragRepository.findByLehrerAndTag(deutschLehrer, montag);
assertThat(stundenplanEintrag.get(0)).isEqualTo(stundenplanEintragReference);
}
@Test
@DisplayName("Check if correct Stundenplan Eintrag is returned given Lehrer [deutschLehrer]")
void findByLehrer() {
List<StundenplanEintrag> stundenplanEintrag = stundenplanEintragRepository.findByLehrer(deutschLehrer);
assertThat(stundenplanEintrag.get(0).getLehrer()).isEqualTo(deutschLehrer);
}
the tests fail because the adress of the actual objects differ from the "expected" objects adress even if they are "the same" objects.
Expected :de.gabriel.vertretungsplan.models.StundenplanEintrag@38d895e8
Actual :de.gabriel.vertretungsplan.models.StundenplanEintrag@1b897ffb
I understand that it gets a new adress in memory (wrong as pointed out in the comments, it's the hash code). I want to know if it is a good practice to compare by something like the id
or how else you would solve this or if there is a better practice to compare the object returned by a repository with the originally saved object? (And I still want to be able to save the entity only once in the @BeforeAll
annotated method)