2014-05-09 14 views
6

Der folgende Test sollte verwendet werden passieren, aber es funktioniert nichtWie Script in ScalaTest

class EngineTest extends FunSuite { 

    test("engine should not be null") { 
    val manager: ScriptEngineManager = new ScriptEngineManager 
    val engine: ScriptEngine = manager.getEngineByName("nashorn") 
    assert(engine != null) 
    } 
} 

Die manager.getEngineFactories() scheint leer zu sein. Warum? Wie initiiere ich den Kontext?

+0

den Test in der IDE gemacht, aber nicht von Shell SBT. Ich frage mich, was anders ist. – jonbros

+0

der Klassenpfad ist höchstwahrscheinlich das Problem – aepurniet

+0

http://Stackoverflow.com/q/10054252/1296806 für die Verbreitung von Rhino-Unterstützung. –

Antwort

3

Welche Versionen verwenden Sie? Das ist sbt .13.

> console 
[info] Starting scala interpreter... 
[info] 
Welcome to Scala version 2.11.0 (OpenJDK 64-Bit Server VM, Java 1.7.0_25). 
Type in expressions to have them evaluated. 
Type :help for more information. 

scala> import javax.script._ 
import javax.script._ 

scala> new ScriptEngineManager().getEngineByName("scala") 
res0: javax.script.ScriptEngine = [email protected] 

scala> new ScriptEngineManager().getEngineByName("rhino") 
res1: javax.script.ScriptEngine = com.sun.script.javascript.[email protected] 

scala> new ScriptEngineManager().getEngineFactories 
res2: java.util.List[javax.script.ScriptEngineFactory] = [[email protected], [email protected]] 

Warten, fragte Sie Test Kontext -

Nun, bevor ich das Interesse verloren mehr sbt Entzifferung zu libraryDependencies Zugabe:

"org.scala-lang" % "scala-compiler" % scalaVersion.value % "test", 

ermöglicht die Scala Script-Engine Ortung:

Zweifellos gibt es eine einfache Möglichkeit, Laufzeit hinzuzufügen: full-classpath zu testen: f Ull-Klassenpfad direkt. Weil es das einfache Build-Tool ist, oder?

Für Nashorn auf Java 8, beachten Sie den Standort:

> set fullClasspath in Test += Attributed.blank(file(s"${util.Properties.javaHome}/lib/ext/nashorn.jar")) 
[info] Defining test:fullClasspath 
[info] The new value will be used by test:console, test:executeTests and 5 others. 
[info] Run `last` for details. 
[info] Reapplying settings... 
[info] Set current project to goofy (in build file:/home/apm/goofy/) 
> test 
Found 1: [[email protected]] 
[info] Passed: Total 10, Failed 0, Errors 0, Passed 10 

Update: https://github.com/sbt/sbt/issues/1214

Auch I guess it's still considered black art:

// Somehow required to get a js engine in tests (https://github.com/sbt/sbt/issues/1214) 

fork in Test := true 
+0

Ich habe nur raten: '> set (fullClasspath im Test) ++ = (fullClasspath in Runtime) .value 'aber das sind nur Deps. –

+0

Ich glaube, ich habe hier etwas über sbt gelernt. Danke vielmals! – jonbros

4

Sie müssen explizit auf den Script Konstruktor in einem Klassenladeprogramm übergeben . Wenn Sie dies nicht tun, wird Thread.currentThread().getContextClassLoader() verwendet, was bei SBT etwas seltsam ist. Wir geben einfach null in unseren Code ein, um es zum Laufen zu bringen. Sie können auch in getClass.getClassLoader passieren:

class EngineTest extends FunSuite { 
    test("engine should not be null - null classloader") { 
    val manager: ScriptEngineManager = new ScriptEngineManager(null) 
    val engine: ScriptEngine = manager.getEngineByName("nashorn") 
    assert(engine != null) 
    } 

    test("engine should not be null - getClass.getClassLoader classloader") { 
    val manager: ScriptEngineManager = new ScriptEngineManager(getClass.getClassLoader) 
    val engine: ScriptEngine = manager.getEngineByName("nashorn") 
    assert(engine != null) 
    } 
} 

Diese beiden Tests für mich vorbei:

[info] EngineTest: 
[info] - engine should not be null - null classloader 
[info] - engine should not be null - getClass.getClassLoader classloader 
[info] Run completed in 186 milliseconds. 
[info] Total number of tests run: 2 
[info] Suites: completed 1, aborted 0 
[info] Tests: succeeded 2, failed 0, canceled 0, ignored 0, pending 0 
[info] All tests passed.