Datenzeilen werden nicht gelöscht

TM69

Bekanntes Mitglied
Bezugnehmend auf: https://www.java-forum.org/thema/repository-wird-null-im-test.199617/
und den hier befindlichen Beiträgen.

Meine Test sieht jetzt wie folgt aus:
Java:
    @Test
    @Transactional
    void testUpdateUserWithValidData() throws ResourceNotFoundException, NullPointerException, DuplicateException {
        // create user
        String firstname = "firstname";
        String lastname = "lastname";
        String email = "email@email.com";
        String password = "password";
        
        User user = new User(
                firstname,                // password
                lastname,                 // lastname
                email,                     // email
                password                // password
                );

        User createdUser = userService.createUser(null, user);
        Optional<User> foundUser = userService.findUserById(createdUser.getId());
        
        assertTrue( foundUser.isPresent(), "testUpdateUserWithValidData(): User (" + user + ") not stored");

        // create updater
        String creator_firstname = "creator firstname";
        String creator_lastname = "creator lastname";
        String creator_email = "creator_email@email.com";
        String creator_password = "creator password";
        
        User creator = new User(
                creator_firstname,                // password
                creator_lastname,                 // lastname
                creator_email,                     // email
                creator_password                // password
                );

        User creatorUser = userService.createUser(null, creator);
        Optional<User> foundCreator = userService.findUserById(creatorUser.getId());
        
        assertTrue( foundCreator.isPresent(), "testUpdateUserWithValidData(): Creator (" + creator + ") not stored");
        
        // update user
        String updatedFirstname = "updated firstname";
        String updatedLastname = "updated lastname";
        String updatedEmail = "new_email@email.com";
        String updatedPassword = "new password";
        
        User updatedUserData = new User(
                updatedFirstname,                // password
                updatedLastname,                 // lastname
                updatedEmail,                     // email
                updatedPassword                    // password
        );
        
        User updatedUser = userService.updateUser(foundCreator.get(), foundUser.get().getId(), updatedUserData);
        Optional<User> foundUpdatedUser = userService.findUserById(updatedUser.getId());
        
        assertTrue( foundUpdatedUser.isPresent(), "testUpdateUserWithValidData(): Updated User (" + updatedUser + ") not stored");
        
        assertEquals(foundUser.get().getId(), foundUpdatedUser.get().getId(), "testCreateUserWithMinimalistValidData(): User (" + foundUpdatedUser.get() + ") ID not identical with " + foundUser.get().getId());
        assertNull(foundUpdatedUser.get().getCreatedBy(), "testUpdateUserWithValidData(): Updated User (" + foundUpdatedUser.get() + ") creator was set to null");
        assertNotNull(foundUpdatedUser.get().getCreatedAt(), "testUpdateUserWithValidData(): Updated User (" + foundUpdatedUser.get()  + ") creator date was set to null");
        assertEquals(foundCreator.get().getId(), foundUpdatedUser.get().getUpdatedBy().getId(), "testUpdateUserWithValidData(): Updated User (" + foundUpdatedUser.get().getUpdatedBy() + ") updater was not set to " + foundCreator.get().getId());
        assertNotNull(foundUpdatedUser.get().getUpdatedAt(), "testUpdateUserWithValidData(): Updated User (" + foundUpdatedUser.get() + ") updater date was not set");
        assertNull(foundUpdatedUser.get().getDeletedBy(), "testUpdateUserWithValidData(): updated User (" + foundUpdatedUser.get() + ") deleter was set");
        assertNull(foundUpdatedUser.get().getDeletedAt(), "testUpdateUserWithValidData(): Updated User (" + foundUpdatedUser.get() + ") deleter date was set");
        assertEquals(updatedFirstname, foundUpdatedUser.get().getFirstname(), "testCreateUserWithMinimalistValidData(): User (" + foundUpdatedUser.get() + ") Firstname not identical with " + updatedFirstname);
        assertEquals(updatedLastname, foundUpdatedUser.get().getLastname(), "testCreateUserWithMinimalistValidData(): User (" + foundUpdatedUser.get() + ") Lastname not identical with " + updatedLastname);
        assertEquals(updatedEmail, foundUpdatedUser.get().getEmail(), "testCreateUserWithMinimalistValidData(): User (" + foundUpdatedUser.get() + ") Email not identical with " + updatedEmail);
        assertEquals(updatedPassword, foundUpdatedUser.get().getPassword(), "testCreateUserWithMinimalistValidData(): User (" + foundUpdatedUser.get() + ") Password not identical with " + updatedPassword);
        
        // clean up
        userService.removeUser(foundCreator.get().getId());
        userService.removeUser(foundUser.get().getId());
    }

Nachdem dieser Test ausgeführt wurde werden aber die erzeugten Datensätze nicht gelöscht? Soweit ich weis wird nach der Funktion ein commit, wenn keine Exception aufgetreten ist, ausgeführt, da @Transactional gekennzeichnet.
Bei einer Exception wird ein rollback ausgeführt. Da keine Exception geworfen wurde, müssten doch eigentlich die beiden letzten Zeilen auch ausgeführt werden?
 

LimDul

Top Contributor
Ich bin mir nicht sicher, inwieweit bei Tests korrekt beim beenden alles wirklich weggeschrieben wird - normalerweise laufen die ja gegen eine InMemoryDb die nach dem Test eh weg ist.

Man lässt eher selten Unit-Tests gegen eine echte, persistente Datenbank laufen. Das sind normalerweise größere Integrationstests.
 

TM69

Bekanntes Mitglied
Ich bin mir nicht sicher, inwieweit bei Tests korrekt beim beenden alles wirklich weggeschrieben wird - normalerweise laufen die ja gegen eine InMemoryDb die nach dem Test eh weg ist.

Man lässt eher selten Unit-Tests gegen eine echte, persistente Datenbank laufen. Das sind normalerweise größere Integrationstests.
Dann würde sich für mich auf der anderen Seite allerdings die Frage stelle, wie will man es sonst testen?

Zumal ohne Löschung würde dieser oder andere Test-Cases mosern z.B. weil versucht wird ein weiterer Datensatz mit identischer EMail erzeugt wird.
 
Zuletzt bearbeitet:

KonradN

Super-Moderator
Mitarbeiter
Dann würde sich für mich auf der anderen Seite allerdings die Frage stelle, wie will man es sonst testen?
Das ist so wie @LimDul gesagt hat: Du testest mit einer Datenbank, die bei jedem Start der Unit Tests neu erstellt wird. Bei reinen in Memory Datenbanken ist es normal, aber das geht auch mit normalen Datenbanken. Für den Test hinterlegt man dann eine Konfiguration, die angibt, dass die Datenbank bei jedem Start neu angelegt werden soll.

Dann kannst Du die Datenbank zu müllen wie Du willst. So Dinge am Ende zu machen ist auch blöd, denn bei einem Fehler sind die Daten ja auch noch da, weil er da ja auch nicht zu dem Löschen kommt.
 

LimDul

Top Contributor
Es sind ansonsten eigentlich auch keine Unit-Test. Ein Unit Test muss meines Erachtens wiederholbar und unabhängig von anderen sein. Eigentlich am besten auch parallel ausführbar

Das heißt, egal was Test A macht, das darf keine Auswirkungen auf Test B haben.

Deswegen laufen in der Regel Unit Tests gegen eine In-Memory Datenbank, die für jeden einzelnen Unit-Test neu aufgebaut wird.

Wenn du wirklich testen willst, ob der User wirklich gelöscht wird, würde ich es anders machen und mich nicht auf ein Transactional verlassen. Sondern:

a) Das Transactional entfernen und den EntityManager injecten
b) Die Transaktion am Anfang des Unit-Tests starten und am Ende explizit commiten undflushen

Wenn du das gegen eine Shared DB machen willst, brauchst zusätzlich ein BeforeEach/AfterEach, was sicherstellt, dass egal in welchem Zustand der Unit-Test die DB hinterlässt (Der kann ja in jeder Zeile abbrechen), die DB danach wieder im definierten Zustand ist. Das dürfte aber so aufwendig sein, dass es sinnvoller ist, einfach für jeden Test mit einer separaten DB zu starten.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
R Mongodb Daten werden immer überschrieben Datenbankprogrammierung 7
S Variable in main soll mit der generierten Zahl aus einer Methode ausgefüllt werden Datenbankprogrammierung 3
Avalon Attribute werden mit Unterstrich in eine MySQL Datenbank eingetragen Datenbankprogrammierung 10
pkm PostgreSQL Auf eine Spalte kann aus einem Teil der SQL-Aussage nicht zugegriffen werden Datenbankprogrammierung 3
Kirby.exe Es werden keine Einträge in der Datenbank gemacht Datenbankprogrammierung 23
JG12111989 DB-Daten werden falsch dargestellt Datenbankprogrammierung 7
J Java fügt Datensätze ein aber diese werden nicht richtig abgefragt Datenbankprogrammierung 3
I Es kann keine Verbindung zum Server aufgebaut werden Datenbankprogrammierung 12
Ananaskirsche Datenbanktreiber kann nicht geladen werden Datenbankprogrammierung 2
E Warum werden für Datenbanktabellen Schemanamen festgelegt? Datenbankprogrammierung 1
E Warum kann mein SQL-File nicht in DB2 ausgeführt werden? Datenbankprogrammierung 1
M JDBC Tabellen mit Boolean Spalten können nicht erstellt werden. DB Updaten - wie? Datenbankprogrammierung 6
T Tabellen von nicht mehr vorhandenen Entities werden generiert Datenbankprogrammierung 0
J MySQL Workbench Tabellen werden verschoben Datenbankprogrammierung 1
B Nur 99% der Datensätze werden in Tabelle geschrieben Datenbankprogrammierung 2
D [xBaseJ] Datei kann nicht geöffnet werden Datenbankprogrammierung 2
S MySQL Abfrage über mehrere Tabellen + Einträge werden überschrieben Datenbankprogrammierung 1
R Datenbankverbindung kann nicht hergestellt werden Datenbankprogrammierung 8
Kandum MySQL Anzahl gefundener Datensätze bleibt gleich, auch wenn mehr existieren und ausgegeben werden Datenbankprogrammierung 3
J JDBC in Library|"Treiber konnte nicht geladen werden"" Datenbankprogrammierung 2
D MySQL Treiber konnte nicht geladen werden Datenbankprogrammierung 3
D MySQL Daten werden aus Datenbank gelesen, obwohl sie dort gar nicht angekommen sind Datenbankprogrammierung 8
L SQLite Daten werden nicht in die Tabelle eingefügt Datenbankprogrammierung 7
D Können nur angesehende Datensätze geloggt werden? Datenbankprogrammierung 4
T Umlaute werden aus der *.mdb nicht gelesen Datenbankprogrammierung 3
L CLOB-Daten werden beim Einfügen in die Datenbank geändert? Datenbankprogrammierung 5
B Es werden keine Tupel in Tabellen abgelegt Datenbankprogrammierung 2
N Connection kann nicht geschlossen werden!? Datenbankprogrammierung 4
S Hibernate - Abgeleitete Klassen werden nicht angezeigt wenn... Datenbankprogrammierung 6
S Embedded DB, die aus mehreren JVMs gestartet werden kann? Datenbankprogrammierung 10
H Oracle - Indizes werden nicht genommen Datenbankprogrammierung 6
S Identitätsspalte kann nicht aktualisiert werden Datenbankprogrammierung 11
G hibernate.cfg.xml kann nicht gefunden werden. Datenbankprogrammierung 3
B Datenbankverbindung kann nicht aufgebaut werden. Datenbankprogrammierung 2
ARadauer Wann werden Daten übertragen bzw geladen Datenbankprogrammierung 5
P Es werden keine Daten mehr in die Tabelle eingefügt Datenbankprogrammierung 4
T Hibernate - wie werden Kind-Objekte nachgeladen? Datenbankprogrammierung 3
G Daten werden nicht in die datenbank geschrieben Datenbankprogrammierung 6
M SQL-Befehle werden manchmal nicht komplett übermittelt Datenbankprogrammierung 5
M werden executeBatch()-commandos automatisch commitet ? Datenbankprogrammierung 8
H Verbindung mit Connector/J kann nicht aufgebaut werden Datenbankprogrammierung 3
S MySQL und Java: Falsche Daten werden ausgelesen Datenbankprogrammierung 9
M Die gezogenen Daten werden nicht richtig ins JTableeingefügt Datenbankprogrammierung 8
W MySQL-Connector funktioniert nicht über WLAN -> MacOS Datenbankprogrammierung 10
M Meine Datenbank lässt sich mit meiner Methode nicht ändern Datenbankprogrammierung 1
P Reicht finally nicht um DB connections zu schließen in (altem) Java? Datenbankprogrammierung 4
D JOIN COLUMN wird nicht genommen Datenbankprogrammierung 2
Maxim6394 JPA / EclipseLink - n:m Beziehung wird nicht aktualisiert Datenbankprogrammierung 0
J SQLite Abfrage fehlerhaft - komme nicht weiter - please help. Datenbankprogrammierung 3
D Ich möchte dass ich nachdem man den Kommentar geschrieben hat den Kommentar in den Tabelle Bestellübersicht geschbeichert wird klappt nicht bei mir Datenbankprogrammierung 2
M Datenbank Zugraff nach Umwandlung in .jar-Datei nicht mehr möglich Datenbankprogrammierung 4
Auf MySql Datenbank zugreifen funktioniert nicht Datenbankprogrammierung 8
A Java DB Server lässt sich nicht starten Datenbankprogrammierung 3
B SQlite Datenbank, trotz Statements wurden nicht alle Zeilen erzeugt? Datenbankprogrammierung 35
Warum funktioniert MySQL nicht Datenbankprogrammierung 8
S Das printen der Ausgabe des Oracle-SQL-Statements in der Java-Eclipse-Konsole funktioniert nicht Datenbankprogrammierung 6
S Datenbankprogrammierung in Java unter NetBeans 12 funktioniert nicht! Datenbankprogrammierung 1
pkm PostgreSQL Kann mit mybatis einen Parameter für eine postgreSQL-Abfrage nicht übergeben. Datenbankprogrammierung 5
Davee SQLite SQLite Datenbank lässt sich nicht auf anderen PCs öffnen Datenbankprogrammierung 8
Watsoon Treiber wird in Intellij nicht geladen Datenbankprogrammierung 2
Kirby.exe PreparedStatement wird nicht ausgeführt Datenbankprogrammierung 5
rafi072001 MicroServices EurekaClient findet anderern EurekaClient nicht Datenbankprogrammierung 1
D JPA gleiche methode funktioniert an einer Stelle, an der anderen nicht Datenbankprogrammierung 3
Z Datenbank Choicebox wird nicht befüllt Datenbankprogrammierung 15
G MySQL JDBC Metadaten auslesen aus .accdb -> Primärschlüssel manchmal erkannt manchmal nicht Datenbankprogrammierung 3
C MySQL SQL Statement wir nicht ausgeführt Datenbankprogrammierung 11
N Sqlite DB mit Java wird auf Linuxsystem nicht gefunden Datenbankprogrammierung 9
pkm Tomcat Classloader findet bei JPA-Persistierung die Persistence Unit nicht. Datenbankprogrammierung 11
F Tabellen automatisch erstellen wenn sie nicht existieren Datenbankprogrammierung 6
J Netbeans 11 und Eclipse JPA 2.5 Entity wird nicht gefunden Datenbankprogrammierung 4
J Firebase KeepSynced funktioniert nicht Datenbankprogrammierung 0
OnDemand MySQL Trigger löst nicht aus bei Hibernate Update Datenbankprogrammierung 12
R HSQLDB ResultSet update aktualisiert DB, aber nicht das ResultSet Datenbankprogrammierung 2
platofan23 MySQL Java Programm findet Treiber für mySQL auf Debian-Server nicht? Datenbankprogrammierung 11
B MySQL Data Tools Plattform - "Database Connections" findet den Treiber nicht Datenbankprogrammierung 1
OnDemand One to Many bekomm es nicht hin Datenbankprogrammierung 7
L SQL-Statement INSERT INTO ON DUPLICATE KEY UPDATE funktioniert nicht Datenbankprogrammierung 5
OnDemand Update auf Mysql läuft nicht durch Datenbankprogrammierung 30
R jdbc-Zugriff Nicht erlaubt ? Datenbankprogrammierung 16
F H2 ObjectOptimisticLockingFailureException wird nicht geworfen Datenbankprogrammierung 0
R findet Derby.DB nicht !? Datenbankprogrammierung 5
I Datenbankverbindung Oracle DB klappt nicht - getConnection returned null Datenbankprogrammierung 8
X SQLite SQLite Programm beendet/führt nicht weiter aus Datenbankprogrammierung 12
P LDAP: Daten eintragen funktioniert nicht Datenbankprogrammierung 7
S sun.jdbc.odbc.JdbcOdbcDriver wird nicht gefunden Datenbankprogrammierung 2
U Kann die Tabellen nicht finden Datenbankprogrammierung 0
M Java Datenbankanbindung funktioniert nicht Datenbankprogrammierung 4
C MYSQL kann wert nicht eintragen Datenbankprogrammierung 3
J Verbindung zu Derby Datenbank funktioniert nicht Datenbankprogrammierung 14
S MySQL MySQL will einfach nicht, bitte um Rat Datenbankprogrammierung 4
E Warum funktioniert das Erzeugen einer View nicht? Datenbankprogrammierung 1
OnDemand Update table SET will nicht Datenbankprogrammierung 9
M DB-Zugriff funktioniert nach JAR-Erstellung nicht mehr Datenbankprogrammierung 3
J SQL-Statement Meine insert befehle funktionieren nicht und ich weiß nicht wo der fehler liegt Datenbankprogrammierung 5
S MySQL Speicher wird nicht freigegeben bei Datenbankabfragen Datenbankprogrammierung 6
L SQL Statement mit Switch-Case funktioniert nicht Datenbankprogrammierung 6
D MySQL Eingabe wird nicht übernommen... Datenbankprogrammierung 11
H Derby: SYSCS_UTIL.SYSCS_EXPORT_QUERY mit String Abfrage in wehre-Klausel nicht möglich Datenbankprogrammierung 3
F sun.jdbc.odbc.jdbcodbcdriver wird nicht gefuden Datenbankprogrammierung 3
L JTable-DB: Letzter wert wird nicht angezeigt. Datenbankprogrammierung 0

Ähnliche Java Themen

Neue Themen


Oben