SlideShare a Scribd company logo
Spring 歴約1年初⼼者の
Test 奮闘記
タグバンガーズ 内藤
• 内藤 千静
所属:株式会社タグバンガーズ
• Spring 歴 1年弱くらい
• Java 歴4,5年くらい
⾃⼰紹介
奮闘⼀覧
1.JUnit奮闘記
2.Mockito奮闘記
3.SpringRunner奮闘記
1.springRunnerでControllerのテスト
2.springRunnerでrepositoryのテスト
4.まとめ
JUnit奮闘記
研修も終わり、実務を始めてから数⽇
そろそろ、Unit Testも実装していきたいよね。
testのプログラムを書くんだよ。
まあとりあえず、やりながら説明するよ。
Unit Test?(って単体テストだよな…?実装っ
て?)
え?(書くって何だ。)
よくわかんないけどわかりました。
Unit Testを書くにあたってJUnitを使ってくね。
はい?(またよくわからん英語出てきた。)
くそだる…
そして私がどれくらいTestの知識がなかったかというと…
こいつ
Unit Testと仲良くなる為には彼を知るところから
始めなければいけない(ついでにJUnitも)🧐
Unit Testについて調べてみたらこんなことがわかりました
• 作成したコードが要件を満たしているか確認するもの
• プロダクションコードに書かれた処理がユニットテストに提⽰され
るため、プロダクションコードの理解を助けてくれる
• ⼀度書いてしまえば、⼿軽に何度でもテストを⾏うことができます。
そしてJUnitではこんなことができるらしい…!!
⼀度書いてしまえば、
何度でも使いまわせる、、、だと!?
しかも⾃動化される、、、!??
このクラスのtestコードを書け!!
• getWordメソッドが呼ばれた際に想
定している値が返ってくるか
• getWord()の引数1を指定した場合
に”いえーい”が返ってくる
• getWord()の引数2を指定した場合
に”元気ー??”が返ってくる
• 上記以外の引数を渡した場合
に”1or2を⼊⼒して下さい”が返っ
てくるか
実際に⾊々調べながら書いた結果がこちら
assertThat()を使⽤して想定した値が
返ってくるか確認
あれ?割と余裕じゃね…?
👏👏👏
Mockitoテストでの奮闘記
UnitTestを知り、余裕をこいていたある⽇
この修正のテスト書ける?
ほいじゃよろしく👍
それ依存されてるクラスを
mockしなきゃテスト難しいかも
書けます(余裕だわ)
承知です!!
……??なんかエラーがでまくってて上⼿くテ
ストが動かないです。。
mock?
mockito使ってやればいけるよ(^ω^)
mockitoって?
MockitoJUnitRunner
※mockを簡単に使えるように⼿助けしてくれるライブラリの⼀つです。
JUnit単体ではmock Testを⾏うことが不可能なため、
mockライブラリーを使⽤する必要があります。
使⽤する際はいい感じに何かしてくれる
おまじないの@RunWithに
MockitoJunitRunnner.classを指定すると使える
※テストを⾏う際に依存しているクラスを装ってそれっぽく動いてくれる便利な機能
mockを使わなきゃいけない場⾯って?
1. 検証したいクラスは完成済みでテストしたいんだけど、クラスの中で
利⽤している別クラスが未完成の場合
2. 異常系の動作確認を⾏う場合
3. ⻑々と依存しているクラスのnewをおこなうのが⾯倒な場合
4. 外部との連携を⾏うクラスの依存がある場合
この機能を使って実装してみよー
今回は未完成のクラスがあった場合のtest
Constructorを少し変更
テスト
プルリクダメ出し
@InjectMocksを使⽤して書き直してください。
@InjectMocks?わかりました。
(分かったとは⾔っていない)
過去の作成されたTestを⾒漁ってみたらあった
@injectMocks使⽤例画像春
名前はsampleに変更してます。
とりあえず、
⾒つけたTestを⾒ながら作ってみる…
テストもできて、無事プルリク通った
テストを⾏いたい対象のクラス
テスト対象のクラスに
依存しているクラス
SpringRunner奮闘記 ‒Controller編
SpringRunnner?知らんけどいけるっしょ
この修正のテストお願いします。
SpringRunner使ってDIされてるのmockして
みて
承知です!
…。
依存している⼦をmockにしたいのですが、な
んかうまくいきません…。
SpringRunnner?
SpringRunnner使ってやればいけるよ
(^ω^)
これ
SpringRunnnerってそもそもなに?
過去に書かれまくっていたtestから⾒つけ出しました
SpringRunnerは?
Bean同⼠の連携テストを⾏いたい…
テスト上でDIの機能を活⽤したい…
そんな時にSpringRunnerは使うみたいです。
1. JUnit上でSpringのDIコンテナを動かす機能
2. アプリケーションサーバ上にデプロイせずに、Spring MVCの動作を再現する機能
テスト上で@Autowiredが使えるようになるよ。
とりあえず、先輩⽅の作成した過去のテストを⾒てみよう 🙃
?????
SpringRunnerでは@MockBeanで
Mockitoでは@Mock?
@Mockと@MockBeanの違い
@Mock
@MockBean
SpringRunnerから提供されているアノテーションで、mockオブジェクト
が⽣成されると同時にアプリケーションコンテキストに追加される。
mockitoから提供されているアノテーションでmockオブジェクトの⽣成
をしてくれる。
噂のDIコンテナかぁって思って下さい
あ、そうだ、このtestではリクエストを⾏なっ
た際に返ってくるステータスの検証を
⾏なって下さい
?わかりました(分かったとは⾔ってない)
今までみたいにただメソッドを呼び出して返り値をチェックする
感じではなさげな匂いを察知
このクラスに対してリクエストを⾶ばしてステータスをみる的な
いい感じに何かしてくれる
おまじない達
DIしてるspringのやつが貼ってあるていで
返ってくるステータスが
200番かどうか 確認してます。
怒られました。
何で怒られているか
Beanが⾜りずに依存関係が組めていないのでエラーが起こっていました。
SpringでunitTestを実装してみよー!
DIされているビーンのモックを
ここで作る
いい感じ
プルリクを送るとーーー
な、なんだってー!?
最初から⾔ってくれい!!
承知です…。
あと、⼊⼒エラーだった場合に表⽰される
messageの検証もお願いします。
Bodyの中⾝を⾒るので,,,
Content()を⽐較でいいのか,,,?
エラーメッセージはjson形式でresponse bodyの中に
格納されて渡されることになってます。
{ ”errorMessage“: ”⼊⼒エラーです。" }
どうassertしようか 🧐
ライブラリーからjsonの部分抜粋してきました
Jsonpathを使⽤してアサートし無事解決
最終的にできたtestがこちら
springRunner奮闘記 ‒repository編
SpringRunnner?そんなんなれましたわww
Repository.classのテストしてね
承知です!!
データベースとのIntegration Test🤔
データベースへのIntegration Testになると思
うので使うアノテーション気をつけて
習うより慣れろ感覚でとりあえずやってみよー!
ちょっと待って、データのtestってことはsql流さなきゃいけないんじゃないか。。。?
とりあえず過去に作成されたテストを⾒返して、
このアノテーションを使わなきゃいけないのが分かった。
んえええ,テスト環境で
どうやってデータ作ればいいんだよ
実際にデータを登録できる⽅法があることを発⾒
初期データはここにInsertを書けばできる!!
INSERT INT book(code, name) VALUES (ʼ001ʼ, ʻ源⽒物語ʼ);
本を探すrepository
Entity
H2にある初期データを取得し、
アサートを⾏う
まとめ
• SpringRunnerを使⽤することによりテストの幅が広がる
• SpringでのUnitTestは描きやすい
• ⼀年初⼼者でもそれっぽくテストが書けるようになる
終わり

More Related Content

What's hot

SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
Takuto Wada
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
Takafumi ONAKA
 
Node.js Native ESM への道 〜最終章: Babel / TypeScript Modules との闘い〜
Node.js Native ESM への道  〜最終章: Babel / TypeScript Modules との闘い〜Node.js Native ESM への道  〜最終章: Babel / TypeScript Modules との闘い〜
Node.js Native ESM への道 〜最終章: Babel / TypeScript Modules との闘い〜
Teppei Sato
 
Junitを使ったjavaのテスト入門
Junitを使ったjavaのテスト入門Junitを使ったjavaのテスト入門
Junitを使ったjavaのテスト入門Satoshi Kubo
 
MySQLアーキテクチャ図解講座
MySQLアーキテクチャ図解講座MySQLアーキテクチャ図解講座
MySQLアーキテクチャ図解講座
Mikiya Okuno
 
Spring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作るSpring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作る
Go Miyasaka
 
こんなに使える!今どきのAPIドキュメンテーションツール
こんなに使える!今どきのAPIドキュメンテーションツールこんなに使える!今どきのAPIドキュメンテーションツール
こんなに使える!今どきのAPIドキュメンテーションツール
dcubeio
 
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
naoki koyama
 
シリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのかシリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのか
Atsushi Nakada
 
マルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのことマルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのこと
Amazon Web Services Japan
 
マイクロサービス化デザインパターン - #AWSDevDay Tokyo 2018
マイクロサービス化デザインパターン - #AWSDevDay Tokyo 2018マイクロサービス化デザインパターン - #AWSDevDay Tokyo 2018
マイクロサービス化デザインパターン - #AWSDevDay Tokyo 2018
Yusuke Suzuki
 
ジャストシステムJava100本ノックのご紹介
ジャストシステムJava100本ノックのご紹介ジャストシステムJava100本ノックのご紹介
ジャストシステムJava100本ノックのご紹介
JustSystems Corporation
 
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
Yoshitaka Kawashima
 
テストを分類してみよう!
テストを分類してみよう!テストを分類してみよう!
テストを分類してみよう!
Kenji Okumura
 
さくっと理解するSpring bootの仕組み
さくっと理解するSpring bootの仕組みさくっと理解するSpring bootの仕組み
さくっと理解するSpring bootの仕組み
Takeshi Ogawa
 
AWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティスAWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティス
Akihiro Kuwano
 
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方
増田 亨
 
Web api開発をするなら ドキュメントは自動生成にしておこう__ph_per_kaigi2021_
Web api開発をするなら ドキュメントは自動生成にしておこう__ph_per_kaigi2021_Web api開発をするなら ドキュメントは自動生成にしておこう__ph_per_kaigi2021_
Web api開発をするなら ドキュメントは自動生成にしておこう__ph_per_kaigi2021_
Akito Tsukahara
 
やってはいけない空振りDelete
やってはいけない空振りDeleteやってはいけない空振りDelete
やってはいけない空振りDelete
Yu Yamada
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
Takuto Wada
 

What's hot (20)

SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
 
Node.js Native ESM への道 〜最終章: Babel / TypeScript Modules との闘い〜
Node.js Native ESM への道  〜最終章: Babel / TypeScript Modules との闘い〜Node.js Native ESM への道  〜最終章: Babel / TypeScript Modules との闘い〜
Node.js Native ESM への道 〜最終章: Babel / TypeScript Modules との闘い〜
 
Junitを使ったjavaのテスト入門
Junitを使ったjavaのテスト入門Junitを使ったjavaのテスト入門
Junitを使ったjavaのテスト入門
 
MySQLアーキテクチャ図解講座
MySQLアーキテクチャ図解講座MySQLアーキテクチャ図解講座
MySQLアーキテクチャ図解講座
 
Spring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作るSpring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作る
 
こんなに使える!今どきのAPIドキュメンテーションツール
こんなに使える!今どきのAPIドキュメンテーションツールこんなに使える!今どきのAPIドキュメンテーションツール
こんなに使える!今どきのAPIドキュメンテーションツール
 
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
 
シリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのかシリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのか
 
マルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのことマルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのこと
 
マイクロサービス化デザインパターン - #AWSDevDay Tokyo 2018
マイクロサービス化デザインパターン - #AWSDevDay Tokyo 2018マイクロサービス化デザインパターン - #AWSDevDay Tokyo 2018
マイクロサービス化デザインパターン - #AWSDevDay Tokyo 2018
 
ジャストシステムJava100本ノックのご紹介
ジャストシステムJava100本ノックのご紹介ジャストシステムJava100本ノックのご紹介
ジャストシステムJava100本ノックのご紹介
 
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
 
テストを分類してみよう!
テストを分類してみよう!テストを分類してみよう!
テストを分類してみよう!
 
さくっと理解するSpring bootの仕組み
さくっと理解するSpring bootの仕組みさくっと理解するSpring bootの仕組み
さくっと理解するSpring bootの仕組み
 
AWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティスAWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティス
 
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方
 
Web api開発をするなら ドキュメントは自動生成にしておこう__ph_per_kaigi2021_
Web api開発をするなら ドキュメントは自動生成にしておこう__ph_per_kaigi2021_Web api開発をするなら ドキュメントは自動生成にしておこう__ph_per_kaigi2021_
Web api開発をするなら ドキュメントは自動生成にしておこう__ph_per_kaigi2021_
 
やってはいけない空振りDelete
やってはいけない空振りDeleteやってはいけない空振りDelete
やってはいけない空振りDelete
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
 

Spring 歴約1年初心者の Test 奮闘記