mockito Tests

Mariexshhx

Bekanntes Mitglied
Code:
  @Test
  @DisplayName("Begriff kann hinzugefügt werden")
  void test1() {
    Begriff hallo = service.begriffHinzufuegen("hallo");
   verify(repo).save(new Begriff("hallo"));
  }

Code:
  @BeforeEach
  void getService() {
    repo = mock(GlossarRepository.class);
    service = new GlossarService(repo);

  }

Hallo, ich möchte meine Service Methode testen und verifyen, dass save mit dem richtigen Begriff aufgerufen wird. Ich bekomme, aber eine Nullpointer Exception, weil die id NULL ist, denn die id wird erst in der DB gesetzt. Ich mocke das Repository jedoch und möchte nur wissen, ob safe mit dem richtigen Begriff aufgerufen wird. Wieso muss für verify dann eine id gesetzt sein?
 

KonradN

Super-Moderator
Mitarbeiter
Wenn das die GlossarService Klasse, die Du testen willst, so verlangt, dann ist es so. Wir kennen die Klasse ja nicht.

Wenn der GlossarService irgendwas erwartet von dem GlossarRepository, dann musst Du dieses Verhalten ganz klar vorgeben. Das und nichts anders macht das Mocking: Du bekommst da eine Instanz ohne viel Arbeit und Du kannst da vorgeben, was zurück gegeben werden soll!

Also schau dir die Methode begriffHinzufuegen an und überlege, was da aufgerufen wird. Und bei Aufrufen vom GlossarRepository kannst Du Dir überlegen, was du da testen willst und was Du da dann halt als Rückgabe von Aufrufen brauchst.
 

Mariexshhx

Bekanntes Mitglied
Java:
  public Begriff begriffHinzufuegen(String name) {
    Begriff begriff = new Begriff(name);
    return repository.save(begriff);
  }
Wenn das die GlossarService Klasse, die Du testen willst, so verlangt, dann ist es so. Wir kennen die Klasse ja nicht.

Wenn der GlossarService irgendwas erwartet von dem GlossarRepository, dann musst Du dieses Verhalten ganz klar vorgeben. Das und nichts anders macht das Mocking: Du bekommst da eine Instanz ohne viel Arbeit und Du kannst da vorgeben, was zurück gegeben werden soll!

Also schau dir die Methode begriffHinzufuegen an und überlege, was da aufgerufen wird. Und bei Aufrufen vom GlossarRepository kannst Du Dir überlegen, was du da testen willst und was Du da dann halt als Rückgabe von Aufrufen brauchst.
so sieht die Methode aus und ich wollte halt sicherstellen, dass der richtige Begriff gesavt wird
 

Mariexshhx

Bekanntes Mitglied
die id wird im Konstruktor auf null gesetzt
Code:
  @Test
  @DisplayName("Begriff kann hinzugefügt werden")
  void test1() {
    Begriff hallo = service.begriffHinzufuegen("hallo");
   verify(repo).save(hallo);
  }

Wenn ich es so probiere kriege ich diese Fehlermeldung
1679001045737.png
 

Mariexshhx

Bekanntes Mitglied
Wenn das die GlossarService Klasse, die Du testen willst, so verlangt, dann ist es so. Wir kennen die Klasse ja nicht.

Wenn der GlossarService irgendwas erwartet von dem GlossarRepository, dann musst Du dieses Verhalten ganz klar vorgeben. Das und nichts anders macht das Mocking: Du bekommst da eine Instanz ohne viel Arbeit und Du kannst da vorgeben, was zurück gegeben werden soll!

Also schau dir die Methode begriffHinzufuegen an und überlege, was da aufgerufen wird. Und bei Aufrufen vom GlossarRepository kannst Du Dir überlegen, was du da testen willst und was Du da dann halt als Rückgabe von Aufrufen brauchst.
und ich weiß ich kann vorgeben was das repo zurückgeben soll, aber das ist hier doch nicht sinnvoll oder?
 

KonradN

Super-Moderator
Mitarbeiter
und ich weiß ich kann vorgeben was das repo zurückgeben soll, aber das ist hier doch nicht sinnvoll oder?
Das Problem hier ist, dass Du eben nicht so einfach verifizieren kannst auf ein neu erstelltes Objekt. Selbst wenn er Deine verify Vorgabe verstehen würde, hättest Du da ja eine andere Instanz als eben die Instanz, die da im Service erstellt wurde.

Daher würde ich da tatsächlich etwas vorgeben und dann sicher stellen, dass dies zurück gegeben wurde.
 

Mariexshhx

Bekanntes Mitglied
Java:
  @Test
  @DisplayName("Begriff kann hinzugefügt werden")
  void test1() {
    Begriff b = new Begriff(1,"hallo");
    when(repo.save(any())).thenReturn(b);
    Begriff hallo = service.begriffHinzufuegen("hallo");
    assertThat(hallo).isEqualTo(b);

  }
in etwa so?
 

Mariexshhx

Bekanntes Mitglied
Code:
  @Test
  @DisplayName("Begriff kann hinzugefügt werden")
  void test1() {
    Begriff b = new Begriff("hallo");
    when(repo.save(any())).thenReturn(b);
    Begriff hallo = service.begriffHinzufuegen("hallo");
    assertThat(hallo).isEqualTo(b);

  }
bzw so id muss dann nicht gesetzt werden
 

KonradN

Super-Moderator
Mitarbeiter
Ich würde die Instanzen unterschiedlich machen. Denn Du willst ja wirklich sicher gehen, dass die Instanz, die von save zurück gegeben wurde, auch zurückgegeben wird. Wenn Begriff die equals Methode überschreiben sollte, dann wären zwei Instanzen, die mit new Begriff("hallo") erzeugt wurden, ggf. gleich.

Die Instanz kann also ganz unterschiedlich sein. Das kann also eine Instanz mit id sein aber auch etwas ganz anderes.

Es ginge also auch:
Java:
  @Test
  @DisplayName("Begriff kann hinzugefügt werden")
  void test1() {
    Begriff expected = new Begriff("SavedInstance");
    when(repo.save(any())).thenReturn(expected);
    Begriff saved = service.begriffHinzufuegen("WordToSave");
    assertThat(saved).isEqualTo(expected);
  }

  • Die Instanzen sind also klar unterschiedlich
  • Und die Variablen wirklich verständlich benennen. Wenn ich ein Ergebnis erwarte, dann ist das bei mir meist ein expected oder so.
 

mrBrown

Super-Moderator
Mitarbeiter
Wenn dein Test erfolgreich läuft, solltest du in jedem Fall einmal die Service-Methode „kaputt“ machen. Möglichkeiten wären z.B. null statt des Strings übergeben oder an den String noch ein zufälliges Zeichen dran hängen - in beiden Fällen sollte der Test dann fehlschlagen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Robertop Mockito.when mit JDK 21 verursacht Buildfehler "RestrictedIdentifierWhen" Allgemeine Java-Themen 15
C Klasse mit Mockito simulieren Allgemeine Java-Themen 9
J Mockito - Objekte miteinander vergleichen (equals) Allgemeine Java-Themen 6
aze Mockito:Instanzmethode mit any simulieren Allgemeine Java-Themen 4
W Frage zu Klassendesign und Test mit Mockito Allgemeine Java-Themen 5
J Mockito Iterator korrekt mocken Allgemeine Java-Themen 5
Zrebna Wieso sind eigentlich JUnit-Tests in src/test/java platziert - nur Konvention? Allgemeine Java-Themen 7
Robert Zenz Ich brauche bitte mal kurz einen Sanity/Reality-Check betreffend Tests. Allgemeine Java-Themen 9
harrytut Java Input/Output Tests Junit Allgemeine Java-Themen 3
Y Wieso krieg ich die Unit Tests nicht hin Allgemeine Java-Themen 55
Y Wie sinnvolle unit tests schreiben Allgemeine Java-Themen 29
sascha-sphw Erste Schritte Unit und Integration-Tests im Java Modul System Allgemeine Java-Themen 10
P No JUnit tests found Allgemeine Java-Themen 5
hello_autumn Statistische/dynamische Tests Allgemeine Java-Themen 10
B Frage zu Unit-Tests Allgemeine Java-Themen 6
J Alle Unit Tests in Maven Modul Projekt ausführen Allgemeine Java-Themen 7
S Parametrisierte jUnit 5-Tests mit eigenen Datentypen/Klassen-Objekten als Test-Parameter Allgemeine Java-Themen 0
AssELAss Junit-Tests für SQL-Veribindung sowie SQL-Queries? Allgemeine Java-Themen 3
M Selenium JUnit Tests (Auswahl von Testmethoden auswerten) Allgemeine Java-Themen 5
A Performance/Speicherplatz-Nutzung bei Tests Allgemeine Java-Themen 6
M Für was schreibt man Unit-Tests? Allgemeine Java-Themen 55
M Junit Tests durchführen Allgemeine Java-Themen 18
M JUnit Tests vs. DBUnit Tests Allgemeine Java-Themen 3
J JUnit-Tests Zeichensatzproblem ? Allgemeine Java-Themen 2
F Tests mit dynamischem Datum Allgemeine Java-Themen 2
T Junit-Tests in Java Klasse ausführen Allgemeine Java-Themen 26
C JUnit Tests Allgemeine Java-Themen 4
Jay_030 Guice: Frage im Umgang mit Unit-Tests Allgemeine Java-Themen 4
B FileWriter / FileReader testen / Mock-Objekt für Unit Tests? Allgemeine Java-Themen 6
A Seltsames Verhalten von JUnit-Tests im Zusammenspiel mit Ant Allgemeine Java-Themen 6
G JUnit Tests Allgemeine Java-Themen 7
S JUnit Tests für GUI / Oberflächen Allgemeine Java-Themen 2
alexpetri unit tests für pdfs Allgemeine Java-Themen 4
M JUnit und dynamische Tests Allgemeine Java-Themen 11
B J-Unit Tests. Alle Tests eines Package einsammen. Allgemeine Java-Themen 4
K JUnit: Tests über ant aufrufen Allgemeine Java-Themen 2
tfa Unit-Tests für private Methoden Allgemeine Java-Themen 25
W Unit Tests im "Hauptprojekt" oder in Modulen Allgemeine Java-Themen 3
D Tests für Java Allgemeine Java-Themen 3
M Eine Frage über Unit-Tests mit Java Allgemeine Java-Themen 2
N Ausgaben (System.out) umlenken und in Unit-Tests überprüfen? Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben