Та же функция возвращает другой результат при запуске в консоли или spec2

Это очень странная проблема.

У меня есть простой класс, который может декодировать строку base64 и получить первую часть до ::

import scala.util.{Success, Try}
import org.apache.commons.codec.binary.Base64

class IdDecoder {

  def decode(token: String): Option[String] = {
    if (token.isEmpty)
      None
    else
      Try(new String(Base64.decodeBase64(token.getBytes)).split(":")(0)) match {
        case Success(id) => Some(id)
        case _ => None
      }
  }

}

И определить метод, который декодирует строку

object StrangeToken {

  def main(args: Array[String]) {
    decode()
  }

  def decode() = {
    val token = "InternalServerError"
    val Some(id) = (new IdDecoder).decode(token)
    println("### StrangeToken's id len:" + id.length)
    id.toCharArray.foreach(c => println(c.toInt))
    id
  }

}

Запуск в виде простого кода, длина идентификатора составляет 15

Когда я запускаю его в консоли sbt, или в IDEA, или в производстве, результат:

### StrangeToken's id len:15
34
123
94
65533
118
65533
73
65533
65533
122
65533
43
0
0
0

Запуск в качестве теста spec2, длина идентификатора составляет 14

Но когда я запускаю его в spec2, как:

"id decoder" should {
  "get decoded string whose length is 15" in {
    val id = StrangeToken.decode()
    id.length must be equalTo 15
  }
}

Этот тест не пройден, и результат:

### StrangeToken's id len:14
34
123
94
198
118
8226
73
205
212
122
177
43
198
228

Я не уверен, почему результат отличается в spec2.

1 ответ

Решение

Я получаю 14 в моей консоли sbt, где мой сценарий sbt указывает -Dfile.encoding=UTF8,

Ваш new String(bytes) использует кодировку по умолчанию. Вы можете предоставить кодировку конструктору.

Второе предположение:

У вас есть разные версии библиотеки -codec в Test конфигурация и прочее.

Когда я возвращаюсь к версии 1.1, я также получаю 15.

Честно говоря, это было мое второе предположение изначально. В проекте -codec много истории, поэтому несовместимости или изменения в поведении не удивительны. Предположительно поведение, которое вызывает число 14, является более соответствующим.

Также не удивительно, что "общая" зависимость появляется дважды в деревьях зависимостей.

Другие вопросы по тегам