ぽらろいどの日記

新しい知見を得たり、得られた知見を記録したり共有したりする場を予定しています。

Groovy Scriptをテストする

テスト対象のスクリプトを読み込む方法

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にしたモックが期待通り動作しなくなるので、大人しく直列?で実行。