Spring Boot の単体テストと結合テストの例
[最終更新] (2019/06/03 00:34:05)
ここは
趣味のプログラミングを楽しむための情報共有サービス。記事の一部は有料設定にして公開できます。 詳しくはこちらをクリック📝
最近の投稿
注目の記事

概要

こちらのページで構築した Spring Boot アプリケーションのテストを記述するためには spring-boot-starter-test を利用します。依存ライブラリとして JUnitMockito などが利用されています。以下の公式ドキュメントを参考にしつつ簡単な使用方法をまとめます。

サンプルプロジェクト

以下のような構成のサンプルプロジェクトを用意してテストコードを記述してみます。

.
|-- build.gradle
|-- gradle
|   `-- wrapper
|       |-- gradle-wrapper.jar
|       `-- gradle-wrapper.properties
|-- gradlew
|-- gradlew.bat
`-- src
    |-- main
    |   `-- java
    |       `-- hello
    |           |-- Application.java
    |           |-- HelloController.java
    |           `-- HelloService.java
    `-- test
        `-- java
            `-- hello
                |-- HelloControllerIT.java
                |-- HelloControllerITWithMock.java
                |-- HelloControllerTest.java
                `-- HelloServiceTest.java

build.gradle

buildscript {
    ext {
        springBootVersion = '1.5.3.RELEASE'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'

jar {
    baseName = 'gs-spring-boot'
    version =  '0.1.0'
}

repositories {
    mavenCentral()
}

sourceCompatibility = 1.8
targetCompatibility = 1.8

dependencies {
    compile('org.springframework.boot:spring-boot-starter-web')
    testCompile('org.springframework.boot:spring-boot-starter-test')
}

src/main/java/hello/Application.java

package hello;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableScheduling
public class Application {

    public static void main(String[] args) throws Exception {
        SpringApplication.run(Application.class);
    }
}

src/main/java/hello/HelloController.java

package hello;

import org.springframework.web.bind.annotation.RestController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;

@RestController
public class HelloController {

    @Autowired
    private HelloService helloService;

    @RequestMapping("/")
    public String index() {
        return helloService.greet();
    }
}

src/main/java/hello/HelloService.java

package hello;

import org.springframework.stereotype.Service;

@Service
public class HelloService {
    public String greet() {
        return "Hello World";
    }
}

テストコード

以下のコマンドでテストを実行できます。

./gradlew test

一部のテストだけを実行したい場合は以下のようにします。

./gradlew test --tests "hello.HelloServiceTest"

サービス層の単体テスト

src/test/java/hello/HelloServiceTest.java

package hello;

import static org.assertj.core.api.Assertions.assertThat;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class HelloServiceTest {

    @Autowired
    private HelloService helloService;

    @Test
    public void sampleTest() throws Exception {
        assertThat(helloService.greet()).contains("Hello");
    }
}

コントローラ層の単体テスト

src/test/java/hello/HelloControllerTest.java

後述の @AutoConfigureMockMvc ではなく @WebMvcTest を用いて、指定したコントローラ Bean だけをインスタンス化します。サービス層の Bean もインスタンス化されていないため、@MockBean を用いてコントローラが依存するサービスのモックを準備します。返す値は Mockitowhen で設定します。

package hello;

import static org.hamcrest.Matchers.containsString;
import static org.mockito.Mockito.when;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

import org.junit.Test;
import org.junit.runner.RunWith;
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.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;

@RunWith(SpringRunner.class)
@WebMvcTest(HelloController.class)
public class HelloControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @MockBean
    private HelloService helloService;

    @Test
    public void sampleTest() throws Exception {
        when(helloService.greet()).thenReturn("Hello Mock");
        mockMvc.perform(get("/"))
            .andExpect(status().isOk())
            .andExpect(content().string(containsString("Hello Mock")));
    }
}

結合テスト

この続きが気になる方は

Spring Boot の単体テストと結合テストの例

残り文字数は全体の約 28 %
なつかしのねこ
100 円
関連ページ