본문 바로가기

Bug Reports

[sonarqube] @Nonnull의 오탐?

다음과 같은 코드가 있다.

@Nonnull
private Charset getContentTypeCharset(@Nullable MediaType mediaType) {
if (mediaType != null && mediaType.getCharset() != null) {
return mediaType.getCharset();
} else {
return StandardCharsets.UTF_8;
}
}

MediaType에 따라서 캐릭터 셋을 가져오는 코드이다. 획득을 못했을 경우는 기본값으로 UTF-8을 사용하도록 방어가 되어 있다.


그런데, 이상하게 SonarQube에서 NullPointerException이 발생할 수 있다고 경고를 한다.


mediaType인지 null 체크를 하고 있고, getCharset()의 결과도 체크를 하고 있다.

혹시나 해서 테스트 코드를 더 꼼꼼히 작성해 보았다.

def "getContentTypeCharset: mediaType이 null이면 UTF-8을 사용한다."() {
given:
RestTemplateLogger sut = new RestTemplateLogger()

when:
Charset result = sut.getContentTypeCharset(null)

then:
result == StandardCharsets.UTF_8
}

def "getContentTypeCharset: mediaType.getCharset()이 null이면 UTF-8을 사용한다."() {
given:
RestTemplateLogger sut = new RestTemplateLogger()
MediaType mediaType = Mock(MediaType)

and:
mediaType.getCharset() >> null

when:
Charset result = sut.getContentTypeCharset(mediaType)

then:
result == StandardCharsets.UTF_8
}

def "getContentTypeCharset: mediaType.getCharset()이 반환하는 값을 사용한다."() {
given:
RestTemplateLogger sut = new RestTemplateLogger()
MediaType mediaType = Mock(MediaType)

and:
mediaType.getCharset() >> StandardCharsets.ISO_8859_1

when:
Charset result = sut.getContentTypeCharset(mediaType)

then:
result == StandardCharsets.ISO_8859_1
}

하지만 문제가 제현되지 않았다.

그런데 왜 이런 오탐이 발생하는 것인가?

결국 아래와 같이 풀어서 썼다. 이래도 Nullable하다고 할지 모르겠다.