これは何?
-
java.nio.ByteBuffer
を用いてString生成する処理にて、部品化したクラスの単体テストで困ったことの解決
困りごと
@Test
fun hoge() {
val byteBuffer = ByteBuffer.allocate(5) //Byte範囲割り当て
byteBuffer.put("あ".toByteArray()) //ByteArray追加
byteBuffer.flip()
assertEquals("あ",String(byteBuffer.array())) //これでいけると思ったのだが...
}
↓を参考に、ByteBuffer->ByteArray->Stringの順で変換すればassertできるのでは?と思って書いたところ、テスト失敗しました。
あらかじめ配置してるByteBufferのうち、ByteArrayが配置されていない(=ByteArray要素が0)の部分も含めてStringに変換されてしまっているため、Actualの方で欲しいStringあ
の後に不要な文字が変換されてしまっています。
参考までに、下記の記載でByteArrayの内容を出力できます。結果は[-29, -127, -126, 0, 0]
となっており、5Byteのうち末尾の2Byteが0になっています。
println(byteBuffer.array().contentToString())
案1 ByteArrayOutputStreamで取り扱う
@Test
fun hoge() {
val stream = ByteArrayOutputStream()
stream.write("あ".toByteArray()) //ByteArray追加
assertEquals("あ",String(stream.toByteArray()))
}
案2 Charsets.decodeを使う
@Test
fun hoge() {
val byteBuffer = ByteBuffer.allocate(5)
byteBuffer.put("あ".toByteArray())
byteBuffer.flip()
assertEquals("あ",StandardCharsets.UTF_8.decode(byteBuffer).toString())
}