TDD(Test Driven Development、テスト駆動開発)
TDD(Test Driven Development)とは?
- テスト駆動開発。
- まずテストコードを作成し、それを使ってテストを行い、正しく動作しているかのフィードバックを受けながら進める開発方法である。
- 短い開発サイクルの繰り返しに依存する開発プロセスであり、開発者はまず要求される機能に対するテストケースを作成し、それに合うコードを書いてテストを通過させた後、状況に応じてリファクタリングする開発方式を意味する。
- 開発者はテストを書くために該当機能の要求事項を確実に理解する必要があるため、開発前に要求事項へ集中できるようになる。一方で、テストのための参入障壁や作成すべきコード量の増加は短所として挙げられる。
Mockとは?
実際のオブジェクトを作って使用するにはコストが大きい場合や、オブジェクト間の依存性が高く実装しにくい場合に作成する偽物のオブジェクトを指す。
Mockの使用例
- テスト作成のための環境構築
- テストが特定のケースや瞬間に依存する場合
- テスト時間が長くかかる場合
- 個人PCやサーバーの性能問題により動作に時間がかかる場合
Mockitoとは?
- ユニットテストのためのJava mocking frameworkである。
- Javaの単体テストでMockオブジェクトをサポートするテストフレームワークである。
- つまり、単体テストを行うためにMockを作成するフレームワークである。
- Mockオブジェクトの生成、Mockオブジェクトの動作指定、そしてテスト対象ロジックが正しく実行されたかの確認が可能である。
- 一般的にSpringのようなWebアプリケーションを開発する場合、複数のオブジェクト間に依存関係が存在する。このような依存関係は単体テストの作成を難しくするが、それを解決するために偽物のオブジェクトを注入するMockitoライブラリを活用できる。
- Mockitoを活用することで、偽物のオブジェクトに望む結果をStubし、単体テストを進めることができる。
Mockオブジェクトの依存性注入
- Mockitoでは、Mock(偽物)オブジェクトの依存性注入のために主に3つのアノテーションが使われる。
@Mock- Mockオブジェクトを作成して返すアノテーション
@Spy- Stubしていないメソッドは元のメソッドをそのまま使用するアノテーション
@InjectMocks@Mockまたは@Spyで生成された偽物のオブジェクトを自動的に注入するアノテーション- 例えば
UserControllerの単体テストを作成したいとき、UserServiceを使用しているなら、@Mockアノテーションで偽物のUserServiceを作成し、@InjectMocksでそれをUserControllerに注入できる。