Spring Boot + npm + Geb で入力フォームを作ってテストする ( その61 )( 確認画面を作成する4 )
概要
記事一覧はこちらです。
Spring Boot + npm + Geb で入力フォームを作ってテストする ( その60 )( 確認画面を作成する3 ) の続きです。
- 今回の手順で確認できるのは以下の内容です。
- 確認画面の作成
- サーバ側のテストを作成します。2回に分けます。
参照したサイト・書籍
目次
- pmd-project-rulesets.xml を変更する
- SessionData2ConfirmFormTypeMap クラスのテストを作成する
- SessionData2InquiryDataTypeMap クラスのテストを作成する
- 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」ボタンをクリックします。
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 == [] } }
テストを実行して全て成功することを確認します。
SessionData2InquiryDataTypeMap クラスのテストを作成する
src/main/java/ksbysample/webapp/bootnpmgeb/mapper/SessionData2InquiryDataTypeMap.java で Ctrl+Shift+T を押して「Create Test」ダイアログを表示してから、以下の画像の値にした後「OK」ボタンをクリックします。
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 } }
テストを実行して全て成功することを確認します。
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」ボタンをクリックします。
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[]
になります。
テストを実行して全て成功することを確認します。
履歴
2018/06/23
初版発行。