다음과 같은 코드가 있다.
@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하다고 할지 모르겠다.
'Bug Reports' 카테고리의 다른 글
우아콘2022는 왜 비밀번호 상한 길이의 제한을 두는 걸까? (0) | 2022.10.14 |
---|---|
[Culture] Liskov was female! (리스코프는 여자였다!) (0) | 2020.08.05 |
Garmin Connect 앱의 한글 문제로 인한 Case Open (0) | 2018.03.03 |
MS도 jquery를 사용 & IE8를 버렸나? (0) | 2014.11.12 |
OruxMaps v.5.5.16 버그(OruxMaps v.5.5.18 해결) (0) | 2014.03.24 |