Table of Contents
はじめに
FundastA Inc.の鈴木です。
Javaの単体テストを実施しました。
その際に単体テストが思ったよりもうまく進まず、わからないことが多かったです。
なので、初心者なりに備忘録としてブログに書いてみようと思います。
今回は単体テストの方法を記載します。次回の記事で実際に行った単体テストを記載します。
単体テストとは
プログラムを構成する比較的小さな単位が個々の機能を正しく果たしているかどうかを検証すること。
なぜ単体テストが必要なのか
-
モジュールが結合される前の段階でテストが実施されるため、問題の原因の特定や修正が容易であり、開発全体のバグ修正コストを下げる効果が高い
-
ソフトウェアの各部分が正しく機能していることと、将来も継続していることを検証し、強固な基盤を提供する。
-
製造プロセスの初期段階で欠陥を検出するため、開発サイクルの後期段階で修正するコスト削減
-
テストを素早く再実行して動作が変わっていないことを検証できるため、比較的に安心してリファクタリング行える。
-
コードがどれくらい単体テストに適しているかを考慮するようになり、別の視点からコードを眺め、実装においてエラー条件を検討することが増える。
用語の意味
モック化とは
テストに必要な部品の値を疑似的に設定する。
- テスト対象クラスが依存する外部クラスの振る舞いを定義する
- 呼び出されたメソッドの引数の型、回数を検証できる。
- 例として、テスト時にコードが未実装や処理が膨大であるときに、未実装部分等をモック化することで、部品として使えるようにしておくことができる。
アノテーション
アノテーションとは
コンピュータに対してソースコードだけでは、命令しきれない情報を伝えるために使用する。
@Test
テストメソッドとして認識するためのアノテーション
テスト対象であることを示している。
1 2 3 4 |
@Test public void Hello(){ ・・・・ } |
@Before
Biforeメソッドとして認識するためのアノテーションであり、そのメソッドはテストメソッド実施の前に実行されます。
1 2 3 4 |
@Before public void Hello(){ ・・・・ } |
@After
Afterメソッドとして認識するためのアノテーションであり、
そのメソッドはテストメソッド実施の後に実行されます。
1 2 3 4 |
@After public void Hello(){ ・・・・ } |
他のアノテーションを知りたい方は、一覧にまとめてあるサイトがありますので、そちらをご覧ください。
モック構文
モックの書き方
1 2 3 4 5 6 7 8 9 10 11 |
@ExtendWith(MockitoExtension.class) public class S3sampleTest { @InjectMocks public static S3sample target = new S3sample(); @Mock(lenient = true) ListObjectsV2Request req; ・・・・・・ } |
@ExtendWithアノテーション
拡張機能を実装したクラスを実際にテストで使用するアノテーション
※今回であれば、MockitoExtension.classを使用したい。
@InjectMocks
@Mockされたモックインスタンスを注入することができるようにする。
@Mock(lenient = true)
@Mockのlenient属性の利用を提示しています。
@Testの書き方
- mock()メソッドを使う
- do~.when()などを用いて記載する。
mock()
1 |
AmazonS3 s3Client = mock(AmazonS3Client.class, withSettings().lenient()); |
doメソッド
doNothing
1 |
doNothing().when(mock).setMaxKeys(5); |
doReturn
1 |
doReturn("test").when(mock).listObjectsV2(any(ListObjectsV2Request.class)); |
※when()内の「mock」を使用して値を返しています。
モック化したメソッドで例外を発生させる。
1 2 3 |
doThrow(new XXException()).when(targetMock).fetch(eq(ID)) doThrow(new XXException()).when(targetMock).delete(eq(ID)) |
doメソッドを使用して、戻り値を自分の指定したものにしたり、どのように動かすのか決めることができます。
おわりに
単体テストについて記載しました。
私自身、単体テストは最初意味が分かりませんでした。
まずはなぜやっているのか、どういうコード例があるのか見てみるとわかりやすくなると思います。
単体テストやってみた②では実際に書いたコードで解説していきたいと思います。
ご覧いただきありがとうございました。
参考記事
Mockitoの記述方法:Mockitoを書く際に参考になった記事です。