相同的函数在控制台或规范 2 中运行时返回不同的结果



这是一个非常奇怪的问题。

我有一个简单的类,可以解码 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
  }
}

以纯代码运行,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 测试运行,id 的长度为 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 中的结果不同。

我碰巧在我的 sbt 控制台中得到 14,我的 sbt 脚本指定了 -Dfile.encoding=UTF8 .

您的new String(bytes)使用默认编码。 您可以向构造函数提供字符集。

第二个猜测:

您在Test配置和其他方面具有不同版本的 -codec 库。

当我将版本推回 1.1 时,我也得到了 15。

老实说,这本来是我的第二个猜测。 -codec 项目中有很多历史,因此不兼容或行为更改并不惊人。 据推测,引发数字 14 的行为更符合要求。

"公共"依赖项在依赖项树中出现两次也不足为奇。

最新更新