読者です 読者をやめる 読者になる 読者になる

かんがるーさんの日記

最近自分が興味をもったものを調べた時の手順等を書いています。今は Spring Boot をいじっています。

共有ライブラリを管理するために Sonatype の Nexus Repository Manager OSS を使用する ( その20 )( Spring Framework に依存するライブラリを作成する3 )

概要

共有ライブラリを管理するために Sonatype の Nexus Repository Manager OSS を使用する ( その19 )( Spring Framework に依存するライブラリを作成する2 ) の続きです。

  • 今回の手順で確認できるのは以下の内容です。
    • テストの実装、及び Nexus への登録まで進めます。

参照したサイト・書籍

  1. Spring Boot Reference Guide - 40. Testing - 40.4.3 OutputCapture
    https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-testing.html#boot-features-output-capture-test-utility

    • 標準出力に出力された内容を OutputCapture で確認する方法を参照しました。
  2. Spring Framework Reference Documentation - 15. Integration Testing - @TestPropertySource
    http://docs.spring.io/spring/docs/current/spring-framework-reference/html/integration-testing.html#__testpropertysource

    • @TestPropertySource を使用して、テストクラスで一時的に properties を設定する方法を参照しました。

目次

  1. src/test/java の下にテスト用の main class を作成する
  2. テスト用の Controller class を作成する
  3. RequestAndResponseLoggerAutoConfiguration クラスのテストを作成する
  4. 全てのテストが成功するか確認する
  5. Nexus に登録する

手順

src/test/java の下にテスト用の main class を作成する

main class はテスト用にあればよいので、src/main/java の下ではなく src/test/java の下に作成します。

  1. src/test/java の下に ksbysample.library.dependspring パッケージを作成します。

  2. src/test/java/ksbysample/library/dependspring の下に Application.java を作成し、リンク先の内容 を記述します。

テスト用の Controller class を作成する

  1. src/test/java/ksbysample/library/dependspring の下に TestController.java を作成し、リンク先の内容 を記述します。

RequestAndResponseLoggerAutoConfiguration クラスのテストを作成する

  1. src/main/java/ksbysample/library/dependspring/config の下の RequestAndResponseLoggerAutoConfiguration.java で「Create Test」ダイアログを表示し、テストクラスを作成します。

    f:id:ksby:20161225225807p:plain

    「Choose Destination Directory」ダイアログが表示されたら src/test/java の方を選択して「OK」ボタンをクリックします。

    f:id:ksby:20161225225901p:plain

    src/test/java/ksbysample/library/dependspring/config の下に RequestAndResponseLoggerAutoConfigurationTest.java が作成されますので、リンク先の内容 を記述します。

全てのテストが成功するか確認する

  1. テストを実行します。RequestAndResponseLoggerAutoConfigurationTest クラスのクラス名の左側に表示されているアイコンをクリックしてコンテキストメニューを表示後「Run 'RequestAndResponseLoggerAutoCo...'」を選択します。

    f:id:ksby:20161225235006p:plain

    テストが成功することが確認できます。

    f:id:ksby:20161225235139p:plain

    「ログが出力される」場合のテストのログを見ると request, response のデータが出力されていることが確認できます。

    f:id:ksby:20161225235343p:plain

Nexus に登録する

  1. Gradle projects View から uploadArchives タスクを実行します。BUILD SUCCESSFUL が表示されて正常に Nexus に登録されました。

    f:id:ksby:20161226003739p:plain

  2. Nexus の管理画面を見ると maven-releases repository に登録されていることが確認できます。

    f:id:ksby:20161226004038p:plain

    f:id:ksby:20161226004242p:plain

  3. ksbysample-library-depend-spring-1.0.0-RELEASE.pom を見ると リンク先の内容 で登録されていました。

  4. 以下の場所の .gitkeep を削除した後、commit します。

    • src/main/java
    • src/main/resources
    • src/test/java

ソースコード

Application.java

package ksbysample.library.dependspring;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

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

}

TestController.java

package ksbysample.library.dependspring;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping("/test")
public class TestController {

    @RequestMapping
    @ResponseBody
    public String index() {
        return "test";
    }

}

RequestAndResponseLoggerAutoConfigurationTest.java

package ksbysample.library.dependspring.config;

import ksbysample.library.dependspring.Application;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.experimental.runners.Enclosed;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.OutputCapture;
import org.springframework.boot.test.SpringApplicationConfiguration;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;

import static org.assertj.core.api.Assertions.assertThat;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

@RunWith(Enclosed.class)
public class RequestAndResponseLoggerAutoConfigurationTest {

    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringApplicationConfiguration(classes = Application.class)
    @WebAppConfiguration
    public static class デフォルトの設定でのテスト {

        public MockMvc mvc;

        @Autowired
        private WebApplicationContext context;

        @Rule
        public OutputCapture capture = new OutputCapture();

        @Before
        public void setUp() throws Exception {
            this.mvc = MockMvcBuilders.webAppContextSetup(this.context)
                    .build();
        }

        @Test
        public void ログが出力される() throws Exception {
            mvc.perform(get("/test"))
                    .andExpect(status().isOk());
            assertThat(capture.toString()).contains("[req][info  ] REQUEST_URI = /test");
            assertThat(capture.toString()).contains("[res][info  ] RESPONSE_STATUS = 200");
        }

    }

    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringApplicationConfiguration(classes = Application.class)
    @WebAppConfiguration
    @TestPropertySource(properties = {"ksbysample.library.request-and-response-logger.execution=execution(* ksbysample.library.dependspring..*.*(..))"})
    public static class executionプロパティ設定時のテスト_出力される設定 {

        public MockMvc mvc;

        @Autowired
        private WebApplicationContext context;

        @Rule
        public OutputCapture capture = new OutputCapture();

        @Before
        public void setUp() throws Exception {
            this.mvc = MockMvcBuilders.webAppContextSetup(this.context)
                    .build();
        }

        @Test
        public void ログが出力される() throws Exception {
            mvc.perform(get("/test"))
                    .andExpect(status().isOk());
            assertThat(capture.toString()).contains("[req][info  ] REQUEST_URI = /test");
            assertThat(capture.toString()).contains("[res][info  ] RESPONSE_STATUS = 200");
        }

    }

    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringApplicationConfiguration(classes = Application.class)
    @WebAppConfiguration
    @TestPropertySource(properties = {"ksbysample.library.request-and-response-logger.execution=execution(* ksbysample.webapp.lending.web..*.*(..))"})
    public static class executionプロパティ設定時のテスト_出力されない設定 {

        public MockMvc mvc;

        @Autowired
        private WebApplicationContext context;

        @Rule
        public OutputCapture capture = new OutputCapture();

        @Before
        public void setUp() throws Exception {
            this.mvc = MockMvcBuilders.webAppContextSetup(this.context)
                    .build();
        }

        @Test
        public void ログが出力されない() throws Exception {
            mvc.perform(get("/test"))
                    .andExpect(status().isOk());
            assertThat(capture.toString()).doesNotContain("[req][info  ] REQUEST_URI = /test");
            assertThat(capture.toString()).doesNotContain("[res][info  ] RESPONSE_STATUS = 200");
        }

    }

}

ksbysample-library-depend-spring-1.0.0-RELEASE.pom

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>ksbysample.library</groupId>
    <artifactId>ksbysample-library-depend-spring</artifactId>
    <version>1.0.0-RELEASE</version>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-autoconfigure</artifactId>
            <scope>compile</scope>
            <exclusions>
                <exclusion>
                    <artifactId>commons-logging</artifactId>
                    <groupId>commons-logging</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <scope>compile</scope>
            <exclusions>
                <exclusion>
                    <artifactId>commons-logging</artifactId>
                    <groupId>commons-logging</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <scope>compile</scope>
            <exclusions>
                <exclusion>
                    <artifactId>commons-logging</artifactId>
                    <groupId>commons-logging</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.5</version>
            <scope>compile</scope>
            <exclusions>
                <exclusion>
                    <artifactId>commons-logging</artifactId>
                    <groupId>commons-logging</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>20.0</version>
            <scope>compile</scope>
            <exclusions>
                <exclusion>
                    <artifactId>commons-logging</artifactId>
                    <groupId>commons-logging</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.assertj</groupId>
            <artifactId>assertj-core</artifactId>
            <version>3.6.1</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <name>Spring依存のテストライブラリ ksbysample-library-depend-spring</name>
    <description>Spring に依存する共有ライブラリである</description>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-parent</artifactId>
                <version>1.3.8.RELEASE</version>
                <scope>import</scope>
                <type>pom</type>
            </dependency>
            <dependency>
                <groupId>io.spring.platform</groupId>
                <artifactId>platform-bom</artifactId>
                <version>2.0.8.RELEASE</version>
                <scope>import</scope>
                <type>pom</type>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

履歴

2016/12/26
初版発行。