CrudRepository save Methode mocken

Mariexshhx

Bekanntes Mitglied
Java:
 @Test
  @DisplayName("Die Begriffe sind alphabetisch sortiert")
  void test_3() {
    GlossarRepository glossar = mock(GlossarRepository.class);
    GlossarService service = new GlossarService(glossar);
    when(glossar.save(any(Begriff.class))).thenReturn(new Begriff("meh"))
            .thenReturn(new Begriff("zzz")).thenReturn(new Begriff("AAA"));
   // when(glossar.save(new Begriff("zzz"))).thenReturn(new Begriff("zzz"));
   // when(glossar.save(new Begriff("AAA"))).thenReturn(new Begriff("AAA"));
    service.begriffHinzufuegen("meh");
    service.begriffHinzufuegen("zzz");
    service.begriffHinzufuegen("AAA");
    assertThat(service.alleBegriffe().stream().map(Begriff::getName).toList())
        .containsExactly("AAA", "meh", "zzz");

Hallo ich möchte mein GlossarRepository mocken, um zu testen, ob die Begriffe sortiert sind. Aber ich kann den safe aufruf von glossar nicht mocken.. Der Test schlägt fehl, weil die Liste leer ist. Kann mir jemand helfen?
 
Sinnvoller wäre vermutlich ein @DataJpaTest um mit einem echten Repository zu arbeiten.

Die Zeilen 6 bis 12 sind vermutlich in dem Kontext alle komplett überflüssig. Du musst die Methode mocken, die von service.alleBegriffe aufgerufen wird- das ist vermutlich findAll. Du hast ja kein echtes Repository, deine Mocks von save funktionieren durchaus. Aber gespeichert wird natürlich nichts, weil da kein Repository hinterhängt.
 
Sinnvoller wäre vermutlich ein @DataJpaTest um mit einem echten Repository zu arbeiten.

Die Zeilen 6 bis 12 sind vermutlich in dem Kontext alle komplett überflüssig. Du musst die Methode mocken, die von service.alleBegriffe aufgerufen wird- das ist vermutlich findAll. Du hast ja kein echtes Repository, deine Mocks von save funktionieren durchaus. Aber gespeichert wird natürlich nichts, weil da kein Repository hinterhängt.
ich soll hier das Repository mocken weil hier die Logik des Services getestet wird. Also muss ich safe und findAll mocken? Und ja alleBegriffe ruft findAll auf... Aber ist der Test nicht useless wenn ich das auch noch mocke?
 
Save brauchst du nicht mocken.

Du mockst nur findAll - das gibt die Werte in einer unsortierten Reihenfolge zurück.
Du testet ja den Code in alleBegriffe - und nur den. Der ruft findAll auf. findAll wird nicht getestet, also wird der simuliert - aka gemocked. Der gibt z.b. die Begriffe C, A, B zurück. findAll gibt ja keine Garantie über die Reihenfolge. Und die Methode alleBegriffe wird nun (hoffentlich) das sortieren. Und genau das testet dein Test.
 
Save brauchst du nicht mocken.

Du mockst nur findAll - das gibt die Werte in einer unsortierten Reihenfolge zurück.
Du testet ja den Code in alleBegriffe - und nur den. Der ruft findAll auf. findAll wird nicht getestet, also wird der simuliert - aka gemocked. Der gibt z.b. die Begriffe C, A, B zurück. findAll gibt ja keine Garantie über die Reihenfolge. Und die Methode alleBegriffe wird nun (hoffentlich) das sortieren. Und genau das testet dein Test.
when(glossar.findAll()).thenReturn(List.of(new Begriff("meh"),new Begriff("zzz"),new Begriff("AAA"))); quasi so?
 

Zurück
Oben