Keine Code Coverage trotz Validen Tests?

Raphael_

Aktives Mitglied
Hi,
ich habe eine logout funktion in meiner Spring boot maven Anwendung integriert und diese funktioniert auch einwandfrei. Ich möchte mein logout System jetzt aber noch mit Tests absichern. Ich nutze SonarQube als mein Code Analysetool und das hat zuvor auch immer ohne Probleme funktioniert. Beim folgenden Code bin ich mir aber eigentlich relativ sicher, dass dieserm getestet sein müsste, obwohl SonarQube mir das Ganze als untestet anzeigt.

Hier ist mein Code:

Java:
@Service
@RequiredArgsConstructor
public class LogoutService implements LogoutHandler {
    private final TokenRepository tokenRepository;
    @Override
    public void logout(
            HttpServletRequest request, //Infos über die Eingegangene Request Header Body usw
            HttpServletResponse response, //Infos über response die rausgehen wird
            Authentication authentication) { //Enthält infos über berechtigung des Users
        final String authHeader = request.getHeader("Authorization");
        final String jwt;
        if (authHeader == null || !authHeader.startsWith("Bearer ")) {
            return;
        }
        jwt = authHeader.substring(7); //Schneidet quasi den Token aus diesem authHeader raus
        var storedToken = tokenRepository.findByToken(jwt)
                .orElse(null);
        if(storedToken != null) {
            storedToken.setExpired(true);
            storedToken.setRevoked(true);
            tokenRepository.save(storedToken);
        }
    }
}

und ich möchte mit dem folgenden Test testen, ob das Programm garnichts macht, wenn der authHeader nicht Bearer enthält.


Code:
private final MockHttpServletRequest request = new MockHttpServletRequest();

    @Mock
    private LogoutService logoutService;

    @Mock
    TokenRepository tokenRepository;
    private final MockHttpServletResponse response = new MockHttpServletResponse();

    @Mock
    Authentication authentication;

    @BeforeEach
    public void setup() {
        MockitoAnnotations.openMocks(this);
    }

    @Test
    void testLogoutService_MakeSureToDoNothingIfAuthHeaderIsInvalid() {
        request.addHeader("Authorization", "invalidHeader");

        String jwt = request.getHeader("Authorization");

        logoutService.logout(request, response, authentication);

        verify(tokenRepository, times(0)).findByToken(jwt);

    }



meinem Verständnis nach müsste also der Test von eben diesen Part hier:


Code:
 if (authHeader == null || !authHeader.startsWith("Bearer ")) {
            return;
}

zumindest als teilweise getestet ansehen. Habe ich hier einen Denkfehler?

Danke schonmal im Vorraus!
 

Marinek

Bekanntes Mitglied
Mit @mock wird die Instanz gemockt und du führst nicht den Code, den du implementiert hast aus.

Dein LogoutService wird auf diese Weise gemockt. Hier müsste @Autowire verwendet werden.
 

Neue Themen


Oben