G*ワークショップZ May 2013 - Spockハンズオン (資料の)まとめ #jggug



残念がら参加できませんでした。
参加できないときは、Ustが(録画も)欲しいなと思ってしまう。


ぐぬぬ

まぁ資料をまとめますか。

開催情報

Spockハンズオン [twitter:@yamkazu]

G*ワークショップZ May 2013 - Spockハンズオンの資料

  • おしながき
    • Spockとは
    • Spockの基礎
    • データ駆動テスト
    • モックサポート
    • 拡張機能
    • 高度な話題

Docに説明資料がある。コードも豊富。
これはいいね。







LT資料

Grails with Spock [twitter:@gantawitter]

ミニ四駆ジャパンカップで勝つ方法を考える [twitter:@kiy0taka]

JJUG CCC の続きというか、本編?をやったっぽい。



まとめ

  • 座席表

http://sekico.co/zaseki/128
セキココしてる人今回少ないね

ブログ
  • Togetter

Spcokのショートカットキーで補完する設定


これの内容がカッコイイのでメモ。
Getting Started with Spock and Groovy

1.File Templateの設定

1) srcを右クリックして、new > Edit File Templates で File Templates を開く

2) + で 新規テンプレートを追加する

3. 以下を設定する

  • Name:Spock Specification
  • Extension:groovy
  • template
#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end


import spock.lang.Specification

#parse("File Header.java")
class ${NAME} extends Specification {


}

2.Spock Specificationを作成を試す

1) new > Spock Specification を選択

2) MyBasicTestで名前をつける


3)以下のコードが生成される


import spock.lang.Specification

/**
 * @author orangeclover
 */
class MyBasicTest extends Specification {


}


OK



次に、Live Templatesという機能らしい。
Ctrl + j dの後にspwgt と打つとSpock Given-When-Thenのテンプレートが補完される。
かっちょええ。
IDE使ってる人には普通なのかもしれないけど(^_^;)


3.Live Templatesの設定

1)File > Settings で Settingsを開く



2)Liveで検索



3) +ボタンで追加


3)spwtの設定


4)spwtの内容
  • Abbreviation:spwt
  • Description:Spock When-Then
def "$NAME$"() {
    when:
    $END$

    then:
    true
    
    
}
5)defieをクリックして、appicable contextsを設定する

6)Groovyのカテゴリにチェックを入れる

7)同じように、spwgtを追加
  • Abbreviation:spwgt
  • Description:Spock Given-When-Then
def "$NAME$"() {
    given:
    $END$

    when:

    then:
    true
    
    
}
8)同じようにspewを追加
  • Abbreviation:spew
  • Description: Spock Expect-Where
def "$NAME$"() {
    expect:
    $END$

    where:
    
    
}
9)Spcokグループ作成

spew選択して move > New Group でSpockグループを作る

10)Spockグループへ移動

move > Spock


なんでLive Tempatesの一覧で右クリックしたらNew Groupが出てこないんだろう。
出てきてもよさそうなもんだが、Renameしかでてこないんだよな。
グループの作成方法が最初分からなかった。



4.Live Templatesの実行

ctrl + J と打ったあと、spで補完が有効になる。

IntelliJ IDEAでSpockはじめました

GettingStarted のIntelliJ IDEAの設定を参考にして、IntelliJ IDEAでSpockをはじめてみました。
とりあえず、環境設定とサンプルの実行で素振の準備。




Groovy1.8.6 はインストール済み。

ダウンロード

IntelliJ IDEAでの設定

1.IntelliJ IDEAを起動
2.プロジェクトの作成
  • 1)File > New Project

  • 2)Create project from scatch

  • 3)プロジェクト名 HelloSpock 設定

  • 4)Create source directory

  • 5)Groovyにチェックを入れる



3.Module Settings
  • 1)srcを右クリックでOpne Module Settingsを選択

  • 2)Dependenciesタブ で + ボタンで「Jars or directories」から追加


Spockのドキュメントだと以下になっている。

In "Module settings", add a "Single-Entry Module Library" for groovy-all-1.8.6.jar, junit-4.9.jar, and spock-core-0.6.jar

Single-Entry Module Library が見当たらなかった。Community Edtionだから?バージョンの違い?
誰か教えて。






  • 3)ダウンロードしたSpockを選択

  • 4)追加した状態



4.Sock用のGroovyクラス追加

  • 1)右クリック new > Groovy Class

GroovyClassとGroovy Scriptって何が違うんだ??


  • 2)HelloSPock という名前

  • 3)コードを写経

import spock.lang.*


class HelloSpock extends spock.lang.Specification {
    def "length of Spock's and his friends' names"() {
        expect:
        name.size() == length

        where:
        name      | length
        "Spock"  | 5
        "Kirk"   | 4
        "Scotty" | 6

    }

}
  • 4)右クリックからRun HelloSpock

5.実行


OK

疑問

IntelliJ IDEA上で@grabって使えないの??
Grabでいけると思ったら、エラーになった。

@Grab('org.spockframework:spock-core:0.6-groovy-1.8')
@GrabExclude('org.codehaus.groovy:groovy-all')

import spock.lang.Specification

/**
 * @author orangeclover
 */
class SpockTest extends Specification {
    def "length of Spock's and his friends' names"() {
        expect:
        name.size() == length

        where:
        name      | length
        "Spock"  | 5
        "Kirk"   | 4
        "Scotty" | 6

    }
}
エラー
C:\usr\opt\java\jdk1.7.0_02\bin\java -ea -Didea.launcher.port=7532 "-Didea.launcher.bin.path=C:\usr\opt\JetBrains\IntelliJ IDEA Community Edition 11.1.2\bin" -Dfile.encoding=UTF-8 -classpath "C:\usr\opt\JetBrains\IntelliJ IDEA Community Edition 11.1.2\lib\idea_rt.jar;C:\usr\opt\JetBrains\IntelliJ IDEA Community Edition 11.1.2\plugins\junit\lib\junit-rt.jar;C:\usr\opt\java\jdk1.7.0_02\jre\lib\alt-rt.jar;C:\usr\opt\java\jdk1.7.0_02\jre\lib\charsets.jar;C:\usr\opt\java\jdk1.7.0_02\jre\lib\deploy.jar;C:\usr\opt\java\jdk1.7.0_02\jre\lib\javaws.jar;C:\usr\opt\java\jdk1.7.0_02\jre\lib\jce.jar;C:\usr\opt\java\jdk1.7.0_02\jre\lib\jsse.jar;C:\usr\opt\java\jdk1.7.0_02\jre\lib\management-agent.jar;C:\usr\opt\java\jdk1.7.0_02\jre\lib\plugin.jar;C:\usr\opt\java\jdk1.7.0_02\jre\lib\resources.jar;C:\usr\opt\java\jdk1.7.0_02\jre\lib\rt.jar;C:\usr\opt\java\jdk1.7.0_02\jre\lib\ext\dnsns.jar;C:\usr\opt\java\jdk1.7.0_02\jre\lib\ext\localedata.jar;C:\usr\opt\java\jdk1.7.0_02\jre\lib\ext\sunec.jar;C:\usr\opt\java\jdk1.7.0_02\jre\lib\ext\sunjce_provider.jar;C:\usr\opt\java\jdk1.7.0_02\jre\lib\ext\sunmscapi.jar;C:\usr\opt\java\jdk1.7.0_02\jre\lib\ext\zipfs.jar;C:\workspace\Spock_SandBox\SpockTest\out\production\SpockTest;C:\usr\opt\Groovy\groovy-1.8.6\lib\ant-1.8.2.jar;C:\usr\opt\Groovy\groovy-1.8.6\lib\ant-antlr-1.8.2.jar;C:\usr\opt\Groovy\groovy-1.8.6\lib\ant-junit-1.8.2.jar;C:\usr\opt\Groovy\groovy-1.8.6\lib\ant-launcher-1.8.2.jar;C:\usr\opt\Groovy\groovy-1.8.6\lib\antlr-2.7.7.jar;C:\usr\opt\Groovy\groovy-1.8.6\lib\asm-3.2.jar;C:\usr\opt\Groovy\groovy-1.8.6\lib\asm-analysis-3.2.jar;C:\usr\opt\Groovy\groovy-1.8.6\lib\asm-commons-3.2.jar;C:\usr\opt\Groovy\groovy-1.8.6\lib\asm-tree-3.2.jar;C:\usr\opt\Groovy\groovy-1.8.6\lib\asm-util-3.2.jar;C:\usr\opt\Groovy\groovy-1.8.6\lib\batik-anim-1.7.jar;C:\usr\opt\Groovy\groovy-1.8.6\lib\batik-awt-util-1.7.jar;C:\usr\opt\Groovy\groovy-1.8.6\lib\batik-bridge-1.7.jar;C:\usr\opt\Groovy\groovy-1.8.6\lib\batik-codec-1.7.jar;C:\usr\opt\Groovy\groovy-1.8.6\lib\batik-css-1.7.jar;C:\usr\opt\Groovy\groovy-1.8.6\lib\batik-dom-1.7.jar;C:\usr\opt\Groovy\groovy-1.8.6\lib\batik-ext-1.7.jar;C:\usr\opt\Groovy\groovy-1.8.6\lib\batik-extension-1.7.jar;C:\usr\opt\Groovy\groovy-1.8.6\lib\batik-gui-util-1.7.jar;C:\usr\opt\Groovy\groovy-1.8.6\lib\batik-gvt-1.7.jar;C:\usr\opt\Groovy\groovy-1.8.6\lib\batik-parser-1.7.jar;C:\usr\opt\Groovy\groovy-1.8.6\lib\batik-script-1.7.jar;C:\usr\opt\Groovy\groovy-1.8.6\lib\batik-svg-dom-1.7.jar;C:\usr\opt\Groovy\groovy-1.8.6\lib\batik-svggen-1.7.jar;C:\usr\opt\Groovy\groovy-1.8.6\lib\batik-swing-1.7.jar;C:\usr\opt\Groovy\groovy-1.8.6\lib\batik-transcoder-1.7.jar;C:\usr\opt\Groovy\groovy-1.8.6\lib\batik-util-1.7.jar;C:\usr\opt\Groovy\groovy-1.8.6\lib\batik-xml-1.7.jar;C:\usr\opt\Groovy\groovy-1.8.6\lib\bsf-2.4.0.jar;C:\usr\opt\Groovy\groovy-1.8.6\lib\commons-cli-1.2.jar;C:\usr\opt\Groovy\groovy-1.8.6\lib\commons-logging-1.1.1.jar;C:\usr\opt\Groovy\groovy-1.8.6\lib\extra166y-1.7.0.jar;C:\usr\opt\Groovy\groovy-1.8.6\lib\Filters.jar;C:\usr\opt\Groovy\groovy-1.8.6\lib\gpars-0.12.jar;C:\usr\opt\Groovy\groovy-1.8.6\lib\graphicsbuilder-0.6.1.jar;C:\usr\opt\Groovy\groovy-1.8.6\lib\graphicsbuilder-ext-animation-0.6.1.jar;C:\usr\opt\Groovy\groovy-1.8.6\lib\graphicsbuilder-ext-jdk6-0.6.1.jar;C:\usr\opt\Groovy\groovy-1.8.6\lib\graphicsbuilder-ext-jhlabs-0.6.1.jar;C:\usr\opt\Groovy\groovy-1.8.6\lib\graphicsbuilder-ext-substance-0.6.1.jar;C:\usr\opt\Groovy\groovy-1.8.6\lib\graphicsbuilder-ext-svg-0.6.1.jar;C:\usr\opt\Groovy\groovy-1.8.6\lib\graphicsbuilder-ext-swf-0.6.1.jar;C:\usr\opt\Groovy\groovy-1.8.6\lib\graphicsbuilder-ext-swingx-0.6.1.jar;C:\usr\opt\Groovy\groovy-1.8.6\lib\groovy-1.8.6.jar;C:\usr\opt\Groovy\groovy-1.8.6\lib\hamcrest-core-1.1.jar;C:\usr\opt\Groovy\groovy-1.8.6\lib\ivy-2.2.0.jar;C:\usr\opt\Groovy\groovy-1.8.6\lib\jansi-1.7.jar;C:\usr\opt\Groovy\groovy-1.8.6\lib\jline-0.9.94.jar;C:\usr\opt\Groovy\groovy-1.8.6\lib\jsilhouette-geom-0.2.jar;C:\usr\opt\Groovy\groovy-1.8.6\lib\jsp-api-2.0.jar;C:\usr\opt\Groovy\groovy-1.8.6\lib\jsr166y-1.7.0.jar;C:\usr\opt\Groovy\groovy-1.8.6\lib\junit-4.10.jar;C:\usr\opt\Groovy\groovy-1.8.6\lib\MultipleGradientPaint.jar;C:\usr\opt\Groovy\groovy-1.8.6\lib\servlet-api-2.4.jar;C:\usr\opt\Groovy\groovy-1.8.6\lib\substance-5.0.jar;C:\usr\opt\Groovy\groovy-1.8.6\lib\substance-extras-5.0.jar;C:\usr\opt\Groovy\groovy-1.8.6\lib\swingx-0.9.2.jar;C:\usr\opt\Groovy\groovy-1.8.6\lib\timingframework-1.0.jar;C:\usr\opt\Groovy\groovy-1.8.6\lib\transformSWF-2.3.jar;C:\usr\opt\Groovy\groovy-1.8.6\lib\xml-apis-ext-1.3.04.jar;C:\usr\opt\Groovy\groovy-1.8.6\lib\xmlpull-1.1.3.1.jar;C:\usr\opt\Groovy\groovy-1.8.6\lib\xstream-1.4.1.jar" com.intellij.rt.execution.application.AppMain com.intellij.rt.execution.junit.JUnitStarter -ideVersion5 SpockTest
Exception in thread "main" java.lang.NoClassDefFoundError: spock/lang/Specification
	at java.lang.ClassLoader.defineClass1(Native Method)
	at java.lang.ClassLoader.defineClass(ClassLoader.java:791)
	at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
	at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
	at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Class.java:264)
	at com.intellij.junit4.JUnit4TestRunnerUtil.loadTestClass(JUnit4TestRunnerUtil.java:224)
	at com.intellij.junit4.JUnit4TestRunnerUtil.appendTestClass(JUnit4TestRunnerUtil.java:208)
	at com.intellij.junit4.JUnit4TestRunnerUtil.buildRequest(JUnit4TestRunnerUtil.java:161)
	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:42)
	at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:195)
	at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:63)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:601)
	at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
Caused by: java.lang.ClassNotFoundException: spock.lang.Specification
	at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
	... 25 more

Process finished with exit code 1

おろ??