Bestpractice : Test JPA Repositories

8u3631984

Bekanntes Mitglied
Hallo zusammen.
Ich zeige euch ersteinmal kurz meine KLassenstruktur :
Java:
@Builder(setterPrefix = "with")
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Entity
@Table(name = "samsSeason", uniqueConstraints = @UniqueConstraint(columnNames = {"startYear", "endYear"}))
@ToString(callSuper = true)
public class Season extends DataEntity {

    @NonNull
    @JoinColumn(name = "startYear")
    private Integer startYear;

    @NonNull
    @JoinColumn(name = "endYear")
    private Integer endYear;
}

Java:
@Builder(setterPrefix = "with")
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Entity
@Table(name = "samsCompetition", uniqueConstraints = @UniqueConstraint(columnNames = {"name", "season"}))
@ToString(callSuper = true)
public class Competition extends DataEntity {

    @NonNull
    @Column(name = "name")
    private String name;

    @NonNull
    @ManyToOne
    @JoinColumn(name = "season")
    private SamsSeason season;
}

Java:
@Repository
public interface CompetitionRepository extends JpaRepository<Competition, Long> {

    Optional<Competition> findByNameAndSamsSeason(String name, Season season);
}

Java:
@Repository
public interface SeasonRepository extends JpaRepository<Season, Long> {

    Optional<Season> findByStartYearAndEndYear(int startYear, int endYear);
}

So ich aheb also ein Season Klasse mit Repository und auch eine Competition Klasse. Meine Frage wenn ich nun das Competition repository testen möchte., z.B dass ein Competition Object richtig angelegt wird, so benötigte ich immer auch ein Season Object. Dieses muss vorher in der Datenbank auch angelegt werden.
Bisher habe ich mir eine TestUtils KLasse geschrieben, die mir solche Objekte erzeugt - also wirklich ind er Datenbank speichert. Meine Frage ist nun : Gibt es da eine elegantere Möglichkeit ?
 

thecain

Top Contributor
Ich weiss nicht ob ein Cascade die Lösung ist. Eventuell für den Test, aber für den UseCase wohl kaum. Wenn eine 1-n Beziehung zwischen Season und Competition besteht, muss eine Season existieren, damit eine Competition durchgeführt werden kann.

Das ist dann auch im Test so und mMn auch korrekt.
 

JAVAKEK

Mitglied
Was heißt hier "Competition repository testen"? Testest du wirklich lediglich, ob findByNameAndSamsSeason() ein korrektes Ergebnis liefert? Dann kannste auch gleich das restliche Spring Framework testen. Unabhängig von dem Sinn des Tests, sehe ich keinen Weg drumherum nicht die konkreten Objekte zu erzeugen.

Falls es dir darum geht, Business Logik zu testen, wo das Competition repository benutzt wird, kannst du natürlich das CompetitionRepository mocken und dir ein zusammengebautes Objekt zurückliefern, ohne irgendwas in die DB zu persistieren.

Vll. haust du mal deinen Testcase hier rein, dann sieht man wohl besser, was du da eigentlich abdecken willst.
 

mrBrown

Super-Moderator
Mitarbeiter
Was heißt hier "Competition repository testen"? Testest du wirklich lediglich, ob findByNameAndSamsSeason() ein korrektes Ergebnis liefert? Dann kannste auch gleich das restliche Spring Framework testen. Unabhängig von dem Sinn des Tests [...]
Der Sinn dürfte Testen der Entitys ("sind Annotationen korrekt") und des Interfaces ("sind die Methoden und Parameter passend benannt") sein, das kann auch unabhängig von der restlichen Anwendung sinnvoll zu testen sein, grad um Fehler einzugrenzen.
 

JAVAKEK

Mitglied
Der Sinn dürfte Testen der Entitys ("sind Annotationen korrekt") und des Interfaces ("sind die Methoden und Parameter passend benannt") sein, das kann auch unabhängig von der restlichen Anwendung sinnvoll zu testen sein, grad um Fehler einzugrenzen.
Ich gebe dir Recht, dass hier Integrationstest bestimmt eine Rolle spielen können. Es kommt aus meiner Sicht auf die Komplexität der Anwendung an. Die Zeit für die Testerstellung, um ein einzelnes Repository zu testen, für das ich nicht mal eine Implementierung bereitstelle oder eigene wilde Queries definiert habe, (Spring startet nicht mal, wenn ich da einen groben Schnitzer in der Benennung habe) würde ich definitiv in ein paar Schichten weiter oben benutzen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
R Spring Boot Test Assertions mit Objekten Frameworks - Spring, Play, Blade, Vaadin & Co 6
8u3631984 Pfad zu Test Datei in application.yml in Spring Boot Test Frameworks - Spring, Play, Blade, Vaadin & Co 7
D Spring Boot Test ob Validation geprüft wurde Frameworks - Spring, Play, Blade, Vaadin & Co 8
8u3631984 Beim WebMVC Test wird Resource File nicht gefunden. Frameworks - Spring, Play, Blade, Vaadin & Co 1
T Repository wird null im Test Frameworks - Spring, Play, Blade, Vaadin & Co 6
R Wie schreibt man Test für einen Controller? Frameworks - Spring, Play, Blade, Vaadin & Co 5
D SpringBootTest H2 Database für Test Frameworks - Spring, Play, Blade, Vaadin & Co 5
M Validations-Test mit @Size Frameworks - Spring, Play, Blade, Vaadin & Co 1
8u3631984 Test Properties aus application.yml Frameworks - Spring, Play, Blade, Vaadin & Co 1
D Spring Unit Test: UnsatisfiedDependencyException: Error creating bean with name Frameworks - Spring, Play, Blade, Vaadin & Co 2
8u3631984 Autowired App im Test später starten Frameworks - Spring, Play, Blade, Vaadin & Co 0
8u3631984 Spring JPA Test in Gradle Sub Module Frameworks - Spring, Play, Blade, Vaadin & Co 1
T JUnit parametrisierter Test Frameworks - Spring, Play, Blade, Vaadin & Co 4
8u3631984 Spring Test findet Component nicht Frameworks - Spring, Play, Blade, Vaadin & Co 4
OnDemand Spring Boot Test mit Junit Frameworks - Spring, Play, Blade, Vaadin & Co 8
bueseb84 Unit Test mit Spring Boot - Service Autowired Frameworks - Spring, Play, Blade, Vaadin & Co 5
F Spring Boot Test Frameworks - Spring, Play, Blade, Vaadin & Co 14
S Integrations Test in Java mit Spring Frameworks - Spring, Play, Blade, Vaadin & Co 2
J Test mit Hibernate und Spring Frameworks - Spring, Play, Blade, Vaadin & Co 5
P Transaktionaler Spring Test ohne von AbstractTransactionalJUnit4SpringContextTests zu erben Frameworks - Spring, Play, Blade, Vaadin & Co 4
H Mehreren repositories eigene EntityManager zuweisen Frameworks - Spring, Play, Blade, Vaadin & Co 4
S Spring Data JPA - Repositories werden nicht injected Frameworks - Spring, Play, Blade, Vaadin & Co 2

Ähnliche Java Themen

Neue Themen


Oben