かんがるーさんの日記

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

Spring Boot + npm + Geb で入力フォームを作ってテストする ( その61 )( 確認画面を作成する4 )

概要

記事一覧はこちらです。

Spring Boot + npm + Geb で入力フォームを作ってテストする ( その60 )( 確認画面を作成する3 ) の続きです。

  • 今回の手順で確認できるのは以下の内容です。
    • 確認画面の作成
    • サーバ側のテストを作成します。2回に分けます。

参照したサイト・書籍

目次

  1. pmd-project-rulesets.xml を変更する
  2. SessionData2ConfirmFormTypeMap クラスのテストを作成する
  3. SessionData2InquiryDataTypeMap クラスのテストを作成する
  4. InquiryMailHelper クラスのテストを作成する

手順

pmd-project-rulesets.xml を変更する

ksbysample.webapp.bootnpmgeb.helper.mail.InquiryMailHelper#generateTextUsingVelocity の Map<String, Object> model = new HashMap<>(); の部分に対して PMD が UseConcurrentHashMap の警告を出してくるのですが、マルチスレッドでアクセスする部分ではないのと、このアプリでは ConcurrentHashMap の使用を考慮する必要はないので、UseConcurrentHashMap の Rule を除外します。

config/pmd/pmd-project-rulesets.xml の以下の点を変更します。

    <rule ref="category/java/multithreading.xml">
        <exclude name="UseConcurrentHashMap"/>
    </rule>
  • <exclude name="UseConcurrentHashMap"/> を追加します。

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

src/main/java/ksbysample/webapp/bootnpmgeb/mapper/SessionData2ConfirmFormTypeMap.java で Ctrl+Shift+T を押して「Create Test」ダイアログを表示してから、以下の画像の値にした後「OK」ボタンをクリックします。

f:id:ksby:20180619014101p:plain

src/test/groovy/ksbysample/webapp/bootnpmgeb/mapper/SessionData2ConfirmFormTypeMapTest.groovy が新規作成されるので、以下の内容を記述します。

package ksbysample.webapp.bootnpmgeb.mapper

import ksbysample.webapp.bootnpmgeb.entity.SurveyOptions
import ksbysample.webapp.bootnpmgeb.helper.db.SurveyOptionsHelper
import ksbysample.webapp.bootnpmgeb.session.SessionData
import ksbysample.webapp.bootnpmgeb.values.JobValues
import ksbysample.webapp.bootnpmgeb.values.SexValues
import ksbysample.webapp.bootnpmgeb.values.Type1Values
import ksbysample.webapp.bootnpmgeb.values.Type2Values
import ksbysample.webapp.bootnpmgeb.web.inquiry.form.ConfirmForm
import ksbysample.webapp.bootnpmgeb.web.inquiry.form.InquiryInput01Form
import ksbysample.webapp.bootnpmgeb.web.inquiry.form.InquiryInput02Form
import ksbysample.webapp.bootnpmgeb.web.inquiry.form.InquiryInput03Form
import org.apache.commons.lang3.StringUtils
import org.modelmapper.ModelMapper
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.context.SpringBootTest
import spock.lang.Specification

import java.util.stream.Collectors

@SpringBootTest
class SessionData2ConfirmFormTypeMapTest extends Specification {

    @Autowired
    private ModelMapper modelMapper

    @Autowired
    private SurveyOptionsHelper soh

    InquiryInput01Form inquiryInput01Form
    InquiryInput02Form inquiryInput02Form
    InquiryInput03Form inquiryInput03Form
    SessionData sessionData

    def setup() {
        inquiryInput01Form = new InquiryInput01Form(
                lastname: "田中"
                , firstname: "太郎"
                , lastkana: "たなか"
                , firstkana: "たろう"
                , sex: SexValues.MALE.value
                , age: "30"
                , job: JobValues.EMPLOYEE.value
        )
        inquiryInput02Form = new InquiryInput02Form(
                zipcode1: "100"
                , zipcode2: "0005"
                , address: "東京都千代田区丸の内"
                , tel1: "03"
                , tel2: "1234"
                , tel3: "5678"
                , email: "test@sample.co.jp"
        )
        inquiryInput03Form = new InquiryInput03Form(
                type1: Type1Values.PRODUCT.value
                , type2: [Type2Values.CATALOGUE.value
                          , Type2Values.ESTIMATE.value
                          , Type2Values.OTHER.value]
                , inquiry: "これは\r\nテスト\r\nです。"
                , survey: soh.selectItemList("survey").stream()
                .map { SurveyOptions surveyOptions -> surveyOptions.itemValue }
                .collect()
        )
        sessionData = new SessionData(
                inquiryInput01Form: inquiryInput01Form
                , inquiryInput02Form: inquiryInput02Form
                , inquiryInput03Form: inquiryInput03Form
        )
    }

    def "全ての項目に値がセットされている場合のテスト"() {
        setup:
        ConfirmForm confirmForm = modelMapper.map(sessionData, ConfirmForm)

        expect:
        confirmForm.name == "田中 太郎"
        confirmForm.kana == "たなか たろう"
        confirmForm.sex == SexValues.MALE.text
        confirmForm.age == "30"
        confirmForm.job == JobValues.EMPLOYEE.text
        confirmForm.zipcode == "100-0005"
        confirmForm.address == "東京都千代田区丸の内"
        confirmForm.tel == "03-1234-5678"
        confirmForm.email == "test@sample.co.jp"
        confirmForm.type1 == Type1Values.PRODUCT.text
        confirmForm.type2 == [Type2Values.CATALOGUE.text
                              , Type2Values.ESTIMATE.text
                              , Type2Values.OTHER.text].stream()
                .collect(Collectors.joining("、"))
        confirmForm.inquiry == "これは\r\nテスト\r\nです。"
        confirmForm.survey == soh.selectItemList("survey").stream()
                .map { SurveyOptions surveyOptions -> surveyOptions.itemName }
                .collect()
    }

    def "任意項目には値がセットされていない場合のテスト"() {
        setup:
        inquiryInput01Form.job = StringUtils.EMPTY
        inquiryInput02Form.tel1 = StringUtils.EMPTY
        inquiryInput02Form.tel2 = StringUtils.EMPTY
        inquiryInput02Form.tel3 = StringUtils.EMPTY
        inquiryInput03Form.survey = []
        ConfirmForm confirmForm = modelMapper.map(sessionData, ConfirmForm)

        expect:
        confirmForm.name == "田中 太郎"
        confirmForm.kana == "たなか たろう"
        confirmForm.sex == SexValues.MALE.text
        confirmForm.age == "30"
        confirmForm.job == StringUtils.EMPTY
        confirmForm.zipcode == "100-0005"
        confirmForm.address == "東京都千代田区丸の内"
        confirmForm.tel == StringUtils.EMPTY
        confirmForm.email == "test@sample.co.jp"
        confirmForm.type1 == Type1Values.PRODUCT.text
        confirmForm.type2 == [Type2Values.CATALOGUE.text
                              , Type2Values.ESTIMATE.text
                              , Type2Values.OTHER.text].stream()
                .collect(Collectors.joining("、"))
        confirmForm.inquiry == "これは\r\nテスト\r\nです。"
        confirmForm.survey == []
    }

}

テストを実行して全て成功することを確認します。

f:id:ksby:20180619025929p:plain

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

src/main/java/ksbysample/webapp/bootnpmgeb/mapper/SessionData2InquiryDataTypeMap.java で Ctrl+Shift+T を押して「Create Test」ダイアログを表示してから、以下の画像の値にした後「OK」ボタンをクリックします。

f:id:ksby:20180620004147p:plain

src/test/groovy/ksbysample/webapp/bootnpmgeb/mapper/SessionData2InquiryDataTypeMapTest.groovy が新規作成されるので、以下の内容を記述します。

package ksbysample.webapp.bootnpmgeb.mapper

import ksbysample.webapp.bootnpmgeb.dao.InquiryDataDao
import ksbysample.webapp.bootnpmgeb.entity.InquiryData
import ksbysample.webapp.bootnpmgeb.entity.SurveyOptions
import ksbysample.webapp.bootnpmgeb.helper.db.SurveyOptionsHelper
import ksbysample.webapp.bootnpmgeb.session.SessionData
import ksbysample.webapp.bootnpmgeb.values.JobValues
import ksbysample.webapp.bootnpmgeb.values.SexValues
import ksbysample.webapp.bootnpmgeb.values.Type1Values
import ksbysample.webapp.bootnpmgeb.values.Type2Values
import ksbysample.webapp.bootnpmgeb.web.inquiry.form.InquiryInput01Form
import ksbysample.webapp.bootnpmgeb.web.inquiry.form.InquiryInput02Form
import ksbysample.webapp.bootnpmgeb.web.inquiry.form.InquiryInput03Form
import org.apache.commons.lang3.StringUtils
import org.modelmapper.ModelMapper
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.util.StreamUtils
import spock.lang.Specification

import java.nio.charset.StandardCharsets
import java.sql.Clob
import java.util.stream.Collectors

@SpringBootTest
class SessionData2InquiryDataTypeMapTest extends Specification {

    @Autowired
    private ModelMapper modelMapper

    @Autowired
    private SurveyOptionsHelper soh

    @Autowired
    private InquiryDataDao inquiryDataDao

    InquiryInput01Form inquiryInput01Form
    InquiryInput02Form inquiryInput02Form
    InquiryInput03Form inquiryInput03Form
    SessionData sessionData
    Clob inquiryClob

    def setup() {
        inquiryInput01Form = new InquiryInput01Form(
                lastname: "田中"
                , firstname: "太郎"
                , lastkana: "たなか"
                , firstkana: "たろう"
                , sex: SexValues.MALE.value
                , age: "30"
                , job: JobValues.EMPLOYEE.value
        )
        inquiryInput02Form = new InquiryInput02Form(
                zipcode1: "100"
                , zipcode2: "0005"
                , address: "東京都千代田区丸の内"
                , tel1: "03"
                , tel2: "1234"
                , tel3: "5678"
                , email: "test@sample.co.jp"
        )
        inquiryInput03Form = new InquiryInput03Form(
                type1: Type1Values.PRODUCT.value
                , type2: [Type2Values.CATALOGUE.value
                          , Type2Values.ESTIMATE.value
                          , Type2Values.OTHER.value]
                , inquiry: "これは\r\nテスト\r\nです。"
                , survey: soh.selectItemList("survey").stream()
                .map { SurveyOptions surveyOptions -> surveyOptions.itemValue }
                .collect()
        )
        sessionData = new SessionData(
                inquiryInput01Form: inquiryInput01Form
                , inquiryInput02Form: inquiryInput02Form
                , inquiryInput03Form: inquiryInput03Form
        )
        inquiryClob = inquiryDataDao.createClob()
        inquiryClob.setString(1, "これは\r\nテスト\r\nです。")
    }

    def "全ての項目に値がセットされている場合のテスト"() {
        setup:
        InquiryData inquiryData = modelMapper.map(sessionData, InquiryData)

        expect:
        inquiryData.lastname == "田中"
        inquiryData.firstname == "太郎"
        inquiryData.lastkana == "たなか"
        inquiryData.firstkana == "たろう"
        inquiryData.sex == SexValues.MALE.value
        inquiryData.age == 30
        inquiryData.job == JobValues.EMPLOYEE.value
        inquiryData.zipcode1 == "100"
        inquiryData.zipcode2 == "0005"
        inquiryData.address == "東京都千代田区丸の内"
        inquiryData.tel1 == "03"
        inquiryData.tel2 == "1234"
        inquiryData.tel3 == "5678"
        inquiryData.email == "test@sample.co.jp"
        inquiryData.type1 == Type1Values.PRODUCT.value
        inquiryData.type2 == [Type2Values.CATALOGUE.value
                              , Type2Values.ESTIMATE.value
                              , Type2Values.OTHER.value].stream()
                .collect(Collectors.joining(","))
        StreamUtils.copyToString(inquiryData.inquiry.asciiStream, StandardCharsets.UTF_8) ==
                StreamUtils.copyToString(inquiryClob.asciiStream, StandardCharsets.UTF_8)
        inquiryData.survey == soh.selectItemList("survey").stream()
                .map { SurveyOptions surveyOptions -> surveyOptions.itemValue }
                .collect(Collectors.joining(","))
    }

    def "任意項目には値がセットされていない場合のテスト"() {
        setup:
        inquiryInput01Form.job = StringUtils.EMPTY
        inquiryInput02Form.tel1 = StringUtils.EMPTY
        inquiryInput02Form.tel2 = StringUtils.EMPTY
        inquiryInput02Form.tel3 = StringUtils.EMPTY
        inquiryInput03Form.survey = []
        InquiryData inquiryData = modelMapper.map(sessionData, InquiryData)

        expect:
        inquiryData.lastname == "田中"
        inquiryData.firstname == "太郎"
        inquiryData.lastkana == "たなか"
        inquiryData.firstkana == "たろう"
        inquiryData.sex == SexValues.MALE.value
        inquiryData.age == 30
        inquiryData.job == StringUtils.EMPTY
        inquiryData.zipcode1 == "100"
        inquiryData.zipcode2 == "0005"
        inquiryData.address == "東京都千代田区丸の内"
        inquiryData.tel1 == StringUtils.EMPTY
        inquiryData.tel2 == StringUtils.EMPTY
        inquiryData.tel3 == StringUtils.EMPTY
        inquiryData.email == "test@sample.co.jp"
        inquiryData.type1 == Type1Values.PRODUCT.value
        inquiryData.type2 == [Type2Values.CATALOGUE.value
                              , Type2Values.ESTIMATE.value
                              , Type2Values.OTHER.value].stream()
                .collect(Collectors.joining(","))
        StreamUtils.copyToString(inquiryData.inquiry.asciiStream, StandardCharsets.UTF_8) ==
                StreamUtils.copyToString(inquiryClob.asciiStream, StandardCharsets.UTF_8)
        inquiryData.survey == StringUtils.EMPTY
    }

}

テストを実行して全て成功することを確認します。

f:id:ksby:20180620232715p:plain

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

検証に使用する生成されたメール本文のデータを作成します。src/main/resources/ksbysample/webapp/bootnpmgeb/helper/mail のディレクトリを作成した後、InquiryMailHelperTest-001.txt, InquiryMailHelperTest-002.txt を新規作成し、以下の内容を記述します。

■InquiryMailHelperTest-001.txt

問い合わせフォームから入力された内容は以下の通りです。

お名前(漢字):田中 太郎
お名前(かな):たなか たろう
性別:男性
年齢:30歳
職業:会社員
郵便番号:〒100-0005
住所:東京都千代田区丸の内
電話番号:03-1234-5678
メールアドレス:test@sample.co.jp

お問い合わせの種類1:製品に関するお問い合わせ
お問い合わせの種類2:資料が欲しい、見積が欲しい、その他の問い合わせ
お問い合わせの内容:
これは
テスト
です。
アンケート:
・選択肢1だけ長くしてみる
・選択肢2
・選択肢3
・選択肢4
・選択肢5が少し長い
・選択肢6
・選択肢7
・8

■InquiryMailHelperTest-002.txt

問い合わせフォームから入力された内容は以下の通りです。

お名前(漢字):田中 太郎
お名前(かな):たなか たろう
性別:男性
年齢:30歳
職業:
郵便番号:〒100-0005
住所:東京都千代田区丸の内
電話番号:
メールアドレス:test@sample.co.jp

お問い合わせの種類1:製品に関するお問い合わせ
お問い合わせの種類2:資料が欲しい、見積が欲しい、その他の問い合わせ
お問い合わせの内容:
これは
テスト
です。
アンケート:

src/main/java/ksbysample/webapp/bootnpmgeb/helper/mail/InquiryMailHelper.java で Ctrl+Shift+T を押して「Create Test」ダイアログを表示してから、以下の画像の値にした後「OK」ボタンをクリックします。

f:id:ksby:20180620233923p:plain

src/test/groovy/ksbysample/webapp/bootnpmgeb/helper/mail/InquiryMailHelperTest.groovy が新規作成されるので、以下の内容を記述します。

package ksbysample.webapp.bootnpmgeb.helper.mail

import com.google.common.io.Files
import ksbysample.webapp.bootnpmgeb.entity.SurveyOptions
import ksbysample.webapp.bootnpmgeb.helper.db.SurveyOptionsHelper
import ksbysample.webapp.bootnpmgeb.values.JobValues
import ksbysample.webapp.bootnpmgeb.values.SexValues
import ksbysample.webapp.bootnpmgeb.values.Type1Values
import ksbysample.webapp.bootnpmgeb.values.Type2Values
import ksbysample.webapp.bootnpmgeb.web.inquiry.form.ConfirmForm
import org.apache.commons.lang3.StringUtils
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.core.io.ClassPathResource
import org.springframework.util.StreamUtils
import spock.lang.Specification

import javax.mail.Message
import javax.mail.internet.MimeMessage
import java.nio.charset.StandardCharsets
import java.util.stream.Collectors

@SpringBootTest
class InquiryMailHelperTest extends Specification {

    @Autowired
    private InquiryMailHelper inquiryMailHelper

    @Autowired
    private SurveyOptionsHelper soh

    ConfirmForm confirmForm

    def setup() {
        confirmForm = new ConfirmForm(
                name: "田中 太郎"
                , kana: "たなか たろう"
                , sex: SexValues.MALE.text
                , age: "30"
                , job: JobValues.EMPLOYEE.text
                , zipcode: "100-0005"
                , address: "東京都千代田区丸の内"
                , tel: "03-1234-5678"
                , email: "test@sample.co.jp"
                , type1: Type1Values.PRODUCT.text
                , type2: [Type2Values.CATALOGUE.text
                          , Type2Values.ESTIMATE.text
                          , Type2Values.OTHER.text].stream()
                .collect(Collectors.joining("、"))
                , inquiry: "これは\r\nテスト\r\nです。"
                , survey: soh.selectItemList("survey").stream()
                .map { SurveyOptions surveyOptions -> surveyOptions.itemName }
                .collect()
        )
    }

    def "全ての項目に値がセットされている場合のテスト"() {
        setup:
        MimeMessage message = inquiryMailHelper.createMessage(confirmForm)

        expect:
        message.getFrom()*.toString() == ["inquiry-form@sample.co.jp"]
        message.getRecipients(Message.RecipientType.TO)*.toString() == ["inquiry@sample.co.jp"]
        message.getSubject() == "問い合わせフォームからお問い合わせがありました"
        message.getContent() == Files.asCharSource(
                new File("src/test/resources/ksbysample/webapp/bootnpmgeb/helper/mail/InquiryMailHelperTest-001.txt")
                , StandardCharsets.UTF_8).read()
    }

    def "任意項目には値がセットされていない場合のテスト"() {
        setup:
        confirmForm.job = StringUtils.EMPTY
        confirmForm.tel = StringUtils.EMPTY
        confirmForm.survey = []
        MimeMessage message = inquiryMailHelper.createMessage(confirmForm)

        expect:
        message.getFrom()*.toString() == ["inquiry-form@sample.co.jp"]
        message.getRecipients(Message.RecipientType.TO)*.toString() == ["inquiry@sample.co.jp"]
        message.getSubject() == "問い合わせフォームからお問い合わせがありました"
        message.getContent() == StreamUtils.copyToString(
                new ClassPathResource("ksbysample/webapp/bootnpmgeb/helper/mail/InquiryMailHelperTest-002.txt")
                        .getInputStream(), StandardCharsets.UTF_8)
    }

}
  • Groovy だと message.getFrom()Address[] の戻り値を String の配列かリストに変えたい場合、Arrays.asList(...)stream().map() 等を使用しなくても *.toString() を付ければ String[] になります。

テストを実行して全て成功することを確認します。

f:id:ksby:20180621010408p:plain

履歴

2018/06/23
初版発行。