2015-05-22 5 views
2

Я получаю очень редкое, но повторяющееся исключение MalformedInputException в моем коде ScalaCheck.Редкий (прерывистый) java.nio.charset.MalformedInputException в ScalaCheck

Я не был в состоянии придавить это прекрасно, или получить стабильное воспроизведение, кроме «иногда», но вот код, который я считаю, порождает проблему:

// 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$2.apply$mcV$sp(XML.scala:91) 
    at scala.xml.XML$$anonfun$save$2.apply(XML.scala:91) 
    at scala.xml.XML$$anonfun$save$2.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$8.apply(ForkTests.scala:133) 
    at sbt.React$$anonfun$react$8.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$1$Acceptor$2$.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 

Кто-нибудь есть какие-либо идеи, что является причиной его и более важную, как надежно предотвратить?

ответ

2

Когда JUnitXmlTestsListener сохраняет XML-элемент с XML.save, используется используемая по умолчанию кодировка ISO-8859-1. Вместо этого он должен использовать UTF-8.

Вы можете попытаться удалить JUnitXmlTestsListener из вашей сборки и use specs2 генерировать отчеты junit-xml:

libraryDependencies += "org.specs2" %% "specs2-junit" % "3.6" 

sbt> testOnly *MySpec -- console junitxml 
+0

За исключением, что я не генерируя XML или сохранить его. Весь код показан выше, это, вероятно, происходит глубоко внутри ScalaCheck (я предполагаю) или Play Framework и specs2. Весь тест только генерирует строки, чтобы доказать, что они могут быть сгенерированы. – Zac

+0

Извините, я не прочитал вашу стеклу правильно. Это ошибка JUnitXmlTestListener, они должны использовать лучшую кодировку для сохранения своего результата. Возможно, вы можете удалить слушателя из своей конфигурации sbt и использовать specs2 для генерации отчетов junit xml. – Eric

+0

Интересно. Я не знаю, как JUnitXmlTestListener попадает в микс. Мы уже используем specs2-junit ... хотя ... есть способ, которым мы можем надолго указать «console junitxml» (я думаю о нашем сервере интеграции, который просто запускает цель тестирования build.sbt ... можем ли мы добавить это для build.sbt каким-то образом? »... Я полагаю, мне придется сейчас копаться и узнать, как этот слушатель попал в микс ... – Zac

Смежные вопросы