test
Groovy
spock
spring
spring-boot

Spring boot 1.4 testing with Spock

More than 1 year has passed since last update.


はじめに

Spring Boot 1.4が今年の7月末にリリースされましたね。

こちらの記事にも書いてある通り、Spring Boot 1.4ではテストが非常に改善されました!

となると、Spockでテストを書きたくなりますよね!?

ここではSpring Boot 1.4でSpockを使用したテスト方法について解説したいと思います。(2016/12/27現在)


概要

ここで解説するのは以下の3つです。


  1. Spring Initializrでプロジェクト作成

  2. Groovy&Spock化

  3. Spockでテストケースの作成


1. Spring Initializrでプロジェクト作成

Spring Initializrにアクセスして、必要なモジュールを入れたアプリケーションを作成しましょう。

私は以下のモジュールを入れました。


  • Web

  • DevTools

  • Lombok


2. Groovy&Spock化

残念ながらSpring InitializrにはGroovy、Spockのモジュールが存在しないので、自分で入れなければいけません。

以下の2つのサイトを参考にすれば問題なく実施できます。

spock-sampleに従ってpom.xmlを変更すればGroovy、Spock化することができます。

具体的には、spock-coreのdependencyとgmavenplus-pluginを追加します。

SpringでSpockを使うためには、spock-springのdependencyを追加します。


注意点!!

ここで気をつけなければならないのがSpock1.0ではまだSpring Boot 1.4のテスト用の新しいアノテーションに対応していないのです…

Spock1.1では対応しますがまだリリースされてません。

現在はSpockのリリースノートにも書いてある通り、最新の1.1-rc-2からアノテーションに対応していますので、それ以降のバージョンを採用します。


pom.xml

上記を反映したpom.xmlは以下になります。

    <dependencies>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>

<!-- spock化で追加する部分 -->
<dependency>
<groupId>org.spockframework</groupId>
<artifactId>spock-core</artifactId>
<version>1.1-groovy-2.4-rc-2</version>
<scope>test</scope>
</dependency>
<!-- Springでspockを使うために追加する部分 -->
<dependency>
<groupId>org.spockframework</groupId>
<artifactId>spock-spring</artifactId>
<version>1.1-groovy-2.4-rc-2</version>
<scope>test</scope>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>

<plugin>
<!-- spock化で追加する部分 -->
<groupId>org.codehaus.gmavenplus</groupId>
<artifactId>gmavenplus-plugin</artifactId>
<version>1.4</version>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

あとはディレクトリをsrc/test/javaからsrc/test/groovyに変更しておいたほうがよいです。


3. Spockでテストケースの作成

Spring MVC sliceのテストをここでは書いてみたいと思います。

Spring MVC sliceの方法は@Controlller, @RestController, @JsonComponentに対してテストするときに使用します。


コード

package aha.oretama.jp.controller

import aha.oretama.jp.service.SampleService
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest
import org.springframework.boot.test.mock.mockito.MockBean
import org.springframework.test.web.servlet.MockMvc
import spock.lang.Specification

import static org.mockito.Mockito.*
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*

/**
* @author aha-oretama
*/
@WebMvcTest
class SampleControllerTest extends Specification {

@Autowired
MockMvc mvc

@MockBean
SampleService sampleService

def "GetHello"() {
setup:
def name = "aha-oretama"
when(sampleService.getHello(name)).thenReturn("Hello aha-oretama")

expect:
mvc.perform(get("/hello").param("name", name))
.andExpect(status().isOk())
.andExpect(content().string("Hello aha-oretama"))
}
}


解説


Runner

Spockが適切なRunnerを選んでくれるので@RunWith(SpringRunner.class)は不要です。


WebMvcTest

Spring MVC, Jackson, Gson, Message convertersなどを自動で読みこんで、Auto-Configureしてくれます。

また@Controller, @RestController, @JsonComponent なども読みこみ、Auto-Configureしてくれます。

だけではなく、MockMvcを生成してBean登録もしてくれます。

なので、プログラムする際はWebMvcTestつけとけばOKで、あとは自動でSpring-Boot側がいろいろと面倒みてくれます。


MockBean

@MockBeanをつければ、Spring-Bootが勝手にモック化してくれます。めっちゃ便利。


サンプル

ここで使用したサンプルはGitHubにあげてあるのでよければ参考にしてくださーい。

https://github.com/aha-oretama/spring-boot-1.4-spock-test-sample


最後に

どうでしたか?

Spring Boot 1.4になってからテストが簡単に書けるようになってますし、

それにSpockをあわせることでもっと簡単な記述にできましたね!

Spring Boot 1.4でもどんどんSpockを使っていきましょう!!

P.S.

Spock1.1のリリースが待ち遠しいですねー。