u-ryo's blog

various information for coding...

Category: Groovy

Stubbing in Spock

| Comments

Spockでstubbingして methodのcall回数をassertする必要がありまして。 someClass = Spy(SomeClass)でspyにすると、 3 * someClass.targetMethod(_, _)といったようにassert出来るのですが、 そのtargetMethodを呼ぶ大元のmethodのcallは、 then:ではなくwhen:になければならなかった、という話です。

即ち、

1
2
3
4
5
when:
  ...
then:
  someClass.method() == 'answer'
  3 * someClass.targetMethod(_, _)

ではダメで、

1
2
3
4
5
when:
  ans = someClass.method()
then:
  ans == 'answer'
  3 * someClass.targetMethod(_, _)

でないとなりませんでした、と。

あと、 3 * someClass.targetMethod(_, _)の部分には、 変数とか入れられません。即ち、 (3 + n) * someClass.targetMethod(_, _)とかはダメでした。

Groovy on Java9+

| Comments

いつも忘れちゃうので。 Java9以上のGroovyでmoduleが足りない、 具体的には、

1
2
Caught: java.lang.NoClassDefFoundError: Unable to load class groovy.xml.jaxb.JaxbGroovyMethods due to missing dependency javax/xml/bind/JAXBContext
java.lang.NoClassDefFoundError: Unable to load class groovy.xml.jaxb.JaxbGroovyMethods due to missing dependency javax/xml/bind/JAXBContext

と言われる時。 groovyではどうやって--add-modulesすればいいのかなって。

1
$ JAVA_OPTS='--add-modules=ALL-SYSTEM' groovy ...

Recent Package Managements

| Comments

これも忘れないうちに。

最近のpackage管理は、便利になってるんですけど、用途によって色々と分かれてしまっているので、却って使いづらいというか。apt-get installでいいじゃん... ってのは、ダメなんですかねぇ。

Testing Code in Javadoc Using Groovy

| Comments

pythonにはdoctestというのがあって、 method前段に書いた動作例documentをtestとして動かせるそうな。 同じようなのがJavaにも無いかなと探してみると、 groovy.util.JavadocAssertionTestSuiteを使ってJavadocにtesting codeを書けるんだそう。 うさぎ組 プロダクトコードのJavaDocにテストコードを書く方法より。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Sample {

    /**
     * add prefix 'sample'.
     * <pre class="groovyTestCase">
     *    def sample = new org.kyon_mm.Sample()
     *    assert 'sample foo' == sample.prefixSample("foo")
     * </pre>
     */
    String prefixSample(aaa){
        return "sample $aaa"
    }

}

と書いて、

1
2
3
4
5
6
7
8
9
10
11
import junit.framework.Test
import junit.framework.TestCase
import junit.framework.TestSuite

class ReferenceTests extends TestCase {
    static Test suite()  {
        def suite = new TestSuite()
        suite.addTest( JavadocAssertionTestSuite.suite( 'src/main' ) )
        suite
    }
}

と書けば、gradleでもtestしてくれるそう。 こんなのがあったなんてびっくりポンです。 JDoctestというのもありますが、 Javascriptで記述するというのでGroovyの方がいいですよね。