テスト対象のスクリプトを読み込む方法
1. スクリプトクラスを読み込む
groovy scriptは実行時にクラスとして解釈される。初めからそのようなクラスとして定義していれば、読み込むだけで済む。
クラスとして記述しているので、「スクリプトの一部をSpyする」なども普通にできる。基本的にはこちらで良さそう。
[groovy script] class groovyscript extends Script { def run(){} // should implement def func() { ... } } [test] class ScriptTest extends Specification { def "test"() { given: groovyscript myObject = new groovyscript() when: def str = myObject.func() then: str == expected } }
2. ファイルを読み込んで、クラスとして解釈する
Including a groovy script in another groovy - Stack Overflowの方法で、直接スクリプトとして記述したファイルを読み込んで、クラスとして解釈させる。
クラスそのものがあるわけではないので、恐らくSpyとかはできない。変数へのアクセスも面倒だったような。
class ScriptTest extends Specification { def "test"() { given: File sourceFile = new File("groovyscript.groovy") Class groovyClass = new GroovyClassLoader(getClass().getClassLoader()).parseClass(sourceFile) GroovyObject myObject = (GroovyObject) groovyClass.newInstance() when: def str = myObject.func() then: str == expected } }
メモ
mocking static method of inner class
例えば、モック対象が
class Outer { class Inner { static void a() {} } }
なら、
import Outer import Outer.Inner ... given: GroovyMock(Outer.Inner, global: true) when: script.func() // static void a()を利用しているgroovy scriptの関数 then: 1 * Outer.Inner.a()
ただし、configでテストの並列実行をできるようにすると、global: true
にしたモックが期待通り動作しなくなるので、大人しく直列?で実行。