在 ScalaCheck 中罕见(间歇性)java.nio.charset.MalformedInputException
Rare (intermittent) java.nio.charset.MalformedInputException in ScalaCheck
我的 ScalaCheck 代码中出现非常罕见但可重复的 MalformedInputException。
除了 "occasionally," 之外,我无法完美地确定它或获得可靠的复制品,但我认为这是产生问题的代码:
// Generate varying Unicode characters:
val unicodeCharacter = Gen.choose(Char.MinValue, Char.MaxValue).filter(Character.isDefined)
// Generate varying Unicode strings across all legal characters::
def unicodeGenerator(generator: Gen[Char] = unicodeCharacter, minimum: Int = 5, maximum: Int = 20): Gen[String] = Gen.chooseNum(minimum, maximum).flatMap { n =>
Gen.sequence[String, Char](List.fill(n)(generator))
}
// The unit test that I think is occasionally blowing up:
"random strings longer than 20 characters" ! prop { (s: String) => { s.length > 20 must beTrue } }.setGen(unicodeGenerator(unicodeCharacter, 21, 30))
这是我见过的例外情况:
Exception in thread "Thread-391" java.nio.charset.MalformedInputException: Input length = 1
at java.nio.charset.CoderResult.throwException(CoderResult.java:281)
at sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:285)
at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:125)
at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:135)
at java.io.Writer.write(Writer.java:157)
at scala.xml.XML$.write(XML.scala:108)
at scala.xml.XML$$anonfun$save.apply$mcV$sp(XML.scala:91)
at scala.xml.XML$$anonfun$save.apply(XML.scala:91)
at scala.xml.XML$$anonfun$save.apply(XML.scala:91)
at scala.util.control.Exception$Catch.apply(Exception.scala:102)
at scala.xml.XML$.save(XML.scala:90)
at sbt.JUnitXmlTestsListener.writeSuite(JUnitXmlTestsListener.scala:170)
at sbt.JUnitXmlTestsListener.endGroup(JUnitXmlTestsListener.scala:159)
at sbt.React$$anonfun$react.apply(ForkTests.scala:133)
at sbt.React$$anonfun$react.apply(ForkTests.scala:133)
at scala.collection.immutable.List.foreach(List.scala:318)
at sbt.React.react(ForkTests.scala:133)
at sbt.ForkTests$$anonfun$mainTestTask$Acceptor$.run(ForkTests.scala:74)
at java.lang.Thread.run(Thread.java:745)
Internal error when running tests: sbt.ForkMain$Run$RunAborted: java.net.SocketException: Broken pipe
任何人都知道是什么原因造成的,更重要的是如何可靠地预防它?
当 JUnitXmlTestsListener
使用 XML.save
保存 XML 元素时,使用的默认编码是 ISO-8859-1
。它应该使用 UTF-8
代替。
您可以尝试从构建中删除 JUnitXmlTestsListener
并 use specs2 生成 junit-xml
报告:
libraryDependencies += "org.specs2" %% "specs2-junit" % "3.6"
sbt> testOnly *MySpec -- console junitxml
我的 ScalaCheck 代码中出现非常罕见但可重复的 MalformedInputException。
除了 "occasionally," 之外,我无法完美地确定它或获得可靠的复制品,但我认为这是产生问题的代码:
// Generate varying Unicode characters:
val unicodeCharacter = Gen.choose(Char.MinValue, Char.MaxValue).filter(Character.isDefined)
// Generate varying Unicode strings across all legal characters::
def unicodeGenerator(generator: Gen[Char] = unicodeCharacter, minimum: Int = 5, maximum: Int = 20): Gen[String] = Gen.chooseNum(minimum, maximum).flatMap { n =>
Gen.sequence[String, Char](List.fill(n)(generator))
}
// The unit test that I think is occasionally blowing up:
"random strings longer than 20 characters" ! prop { (s: String) => { s.length > 20 must beTrue } }.setGen(unicodeGenerator(unicodeCharacter, 21, 30))
这是我见过的例外情况:
Exception in thread "Thread-391" java.nio.charset.MalformedInputException: Input length = 1
at java.nio.charset.CoderResult.throwException(CoderResult.java:281)
at sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:285)
at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:125)
at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:135)
at java.io.Writer.write(Writer.java:157)
at scala.xml.XML$.write(XML.scala:108)
at scala.xml.XML$$anonfun$save.apply$mcV$sp(XML.scala:91)
at scala.xml.XML$$anonfun$save.apply(XML.scala:91)
at scala.xml.XML$$anonfun$save.apply(XML.scala:91)
at scala.util.control.Exception$Catch.apply(Exception.scala:102)
at scala.xml.XML$.save(XML.scala:90)
at sbt.JUnitXmlTestsListener.writeSuite(JUnitXmlTestsListener.scala:170)
at sbt.JUnitXmlTestsListener.endGroup(JUnitXmlTestsListener.scala:159)
at sbt.React$$anonfun$react.apply(ForkTests.scala:133)
at sbt.React$$anonfun$react.apply(ForkTests.scala:133)
at scala.collection.immutable.List.foreach(List.scala:318)
at sbt.React.react(ForkTests.scala:133)
at sbt.ForkTests$$anonfun$mainTestTask$Acceptor$.run(ForkTests.scala:74)
at java.lang.Thread.run(Thread.java:745)
Internal error when running tests: sbt.ForkMain$Run$RunAborted: java.net.SocketException: Broken pipe
任何人都知道是什么原因造成的,更重要的是如何可靠地预防它?
当 JUnitXmlTestsListener
使用 XML.save
保存 XML 元素时,使用的默认编码是 ISO-8859-1
。它应该使用 UTF-8
代替。
您可以尝试从构建中删除 JUnitXmlTestsListener
并 use specs2 生成 junit-xml
报告:
libraryDependencies += "org.specs2" %% "specs2-junit" % "3.6"
sbt> testOnly *MySpec -- console junitxml