Tests beim extracten von sub value schlägt fehl

Raphael_

Aktives Mitglied
Hi,
ich habe eine Methode, die einen sub wert aus einem JwtAuthenticationToken extrahiert.
Diese sieht so aus:


Java:
public String getSub(JwtAuthenticationToken tokenAttributes) {
        Jwt jwt = (Jwt) tokenAttributes.getPrincipal();
        return jwt.getClaim("sub");
    }

Ich möchte sie nun testen und habe den Test meines Erachtens nach schon korrekt geschrieben allerdings schlägt er fehl. Das ist mein Test:


Code:
@Test
    void testEndpoint() {
        JwtAuthenticationToken tokenAttributes = Mockito.mock(JwtAuthenticationToken.class);
        Jwt jwt = Mockito.mock(Jwt.class);

        Mockito.when(tokenAttributes.getPrincipal()).thenReturn(jwt);
        Mockito.when(jwt.getClaim("sub")).thenReturn("User123");

        String sub = subExtractionService.getSub(tokenAttributes);

        Assertions.assertEquals("User123", sub);
    }

Eigentlich müsste doch alles passen, oder? Ich bekomme einen Fehler, da ich wie man unten sehen kann User123 erwarte, aber null zurückbekomme. Woran könnte das liegen? Stimmt was mit den Mocks nicht?
 
Evtl. noch etwas ausführlicher:

Du willst diesen Code testen:

Java:
public String getSub(JwtAuthenticationToken tokenAttributes) {
        Jwt jwt = (Jwt) tokenAttributes.getPrincipal();
        return jwt.getClaim("sub");
    }

Dann ist klar, dass Du diesen Teil nicht mocken kannst. Beim Mocken würdest Du ja ein Mock Element schaffen ohne diesen Code. Damit wäre das Testen dieses Codes nicht möglich.

Also wozu denn dann überhaupt mocken?
Du willst genau diesen Code testen. Du willst nicht testen, ob getPrincipal von JwtAuthenticationToken richtig funktioniert. Ebenso willst Du auch nicht getClaim von Jwt testen.

Daher mockst Du diese Teile um dann wirklich Deinen Code (und nur Deinen Code!!) zu testen.

Ich hoffe, dass macht es nun deutlicher, was zu mocken ist und was eben nicht zu mocken ist.
 
Evtl. noch etwas ausführlicher:

Du willst diesen Code testen:

Java:
public String getSub(JwtAuthenticationToken tokenAttributes) {
        Jwt jwt = (Jwt) tokenAttributes.getPrincipal();
        return jwt.getClaim("sub");
    }

Dann ist klar, dass Du diesen Teil nicht mocken kannst. Beim Mocken würdest Du ja ein Mock Element schaffen ohne diesen Code. Damit wäre das Testen dieses Codes nicht möglich.

Also wozu denn dann überhaupt mocken?
Du willst genau diesen Code testen. Du willst nicht testen, ob getPrincipal von JwtAuthenticationToken richtig funktioniert. Ebenso willst Du auch nicht getClaim von Jwt testen.
Java:
java.lang.NullPointerException: Cannot invoke "com.services.Registration.SubExtractionService.getSub(org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken)" because "this.subExtractionService" is null
Daher mockst Du diese Teile um dann wirklich Deinen Code (und nur Deinen Code!!) zu testen.

Ich hoffe, dass macht es nun deutlicher, was zu mocken ist und was eben nicht zu mocken ist.
Ja, da hast du recht, wenn ich alllerdings das @mock weglasse bekomme ich folgenden error, weshalb ich dachte, dass ich das mocken muss.
Java:
java.lang.NullPointerException: Cannot invoke "com.services.Registration.SubExtractionService.getSub(org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken)" because "this.subExtractionService" is null
 

Zurück
Oben