Table of Contents
はじめに
FundastA Inc.の鈴木です。
今回は前回の単体テストを動かしてみた①の続きを記載します。
単体テスト
それでは単体テストの中身を見ていきましょう。
環境設定
1 2 3 4 5 6 7 8 9 10 11 12 |
dependencies { ・・・ testImplementation 'org.junit.jupiter:junit-jupiter:5.7.0' testImplementation 'org.mockito:mockito-core:3.6.0' testImplementation 'org.mockito:mockito-junit-jupiter:3.6.0' testImplementation 'org.powermock:powermock-module-junit4:2.0.2' testImplementation 'org.powermock:powermock-api-mockito2:2.0.2' compileOnly('org.projectlombok:lombok:1.18.8') testCompileOnly('org.projectlombok:lombok:1.18.8') annotationProcessor('org.projectlombok:lombok:1.18.8') testAnnotationProcessor('org.projectlombok:lombok:1.18.8') } |
バージョン等は、ご自身で確認して環境設定してください。
コード
メインコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
package com.example.test.service; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.Iterator; import java.util.List; import com.amazonaws.AmazonServiceException; import com.amazonaws.regions.Regions; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3ClientBuilder; import com.amazonaws.services.s3.model.AmazonS3Exception; import com.amazonaws.services.s3.model.Bucket; import com.amazonaws.services.s3.model.ListObjectsV2Request; import com.amazonaws.services.s3.model.ListObjectsV2Result; import com.amazonaws.services.s3.model.ListVersionsRequest; import com.amazonaws.services.s3.model.ObjectListing; import com.amazonaws.services.s3.model.S3Object; import com.amazonaws.services.s3.model.S3ObjectInputStream; import com.amazonaws.services.s3.model.S3ObjectSummary; import com.amazonaws.services.s3.model.S3VersionSummary; import com.amazonaws.services.s3.model.VersionListing; public class OperateS3Service { // S3クライアントを生成 private AmazonS3 s3 = AmazonS3ClientBuilder.standard().withRegion(Regions.DEFAULT_REGION).build(); /** * S3オブジェクトの要約を取得します. * * @param bucketName オブジェクト取得対象のバケット名 * @return List:S3ObjectSummary */ //バケット名、プレフィックス、最大値を変数として指定 public List<S3ObjectSummary> getObjectsSummaries(String bucketName, String prefix, int max) { //ListObjectV2Resultのインスタンスの作成 ListObjectsV2Request req = new ListObjectsV2Request(); //バケット名やプレフィックス、最大値の決定 req.setBucketName(bucketName); req.setPrefix(prefix); req.setMaxKeys(10); //バケット内のオブジェクトを一覧表示したものをresultに挿入 ListObjectsV2Result result = s3.listObjectsV2(req); //返り値としてresultからObjectSummaryのリストを設定 return result.getObjectSummaries(); } } |
テストコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
package com.example.test.service; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doReturn; import java.util.Date; import java.util.List; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Spy; import org.mockito.junit.jupiter.MockitoExtension; import com.amazonaws.services.s3.AmazonS3Client; import com.amazonaws.services.s3.model.ListObjectsV2Request; import com.amazonaws.services.s3.model.ListObjectsV2Result; import com.amazonaws.services.s3.model.S3ObjectSummary; @ExtendWith(MockitoExtension.class) public class OperateS3ServiceTest { @InjectMocks public static OperateS3Service target = new OperateS3Service(); @Mock AmazonS3Client client; @Test public void test1() { //ListObjectV2Resultのインスタンスの作成 ListObjectsV2Result result = new ListObjectsV2Result(); //モック化したClientだった時、返り値としてresult doReturn(result).when(client).listObjectsV2(any(ListObjectsV2Request.class)); //OperateS3serviceクラスのgetObjectsSummariesを実行 List<S3ObjectSummary> res = target.getObjectsSummaries("bucket", "pre", 10); //resのサイズと0は同じかどうかを判定している。 assertEquals(res.size(), 0, ""); } } |
コード解説
詳細説明
モック化やどのような流れでテストが実行されているか説明していきます。
まず該当するコードを抜粋して記載します。
メインコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
//③クラス実行 public class OperateS3Service { //バケット名、プレフィックス、最大値を変数として指定 public List<S3ObjectSummary> getObjectsSummaries(String bucketName, String prefix, int max) { //ListObjectsV2Requestのインスタンスの作成 ListObjectsV2Request req = new ListObjectsV2Request(); //バケット名やプレフィックス、最大値の決定 req.setBucketName(bucketName); req.setPrefix(prefix); req.setMaxKeys(10); //①バケット内のオブジェクトの中からreqに該当するものを<strong>resultに挿入 ListObjectsV2Result result = s3.listObjectsV2(req);</strong> //返り値としてresultからObjectSummaryのリストを設定 return result.getObjectSummaries(); } } |
テストコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
@InjectMocks public static OperateS3Service target = new OperateS3Service(); @Mock AmazonS3Client client; @Test public void test1() { //①ListObjectV2Resultのインスタンスの作成 ListObjectsV2Result result = new ListObjectsV2Result(); //②モック化したClientだった時、返り値としてresultを返す。 doReturn(result).when(client).listObjectsV2(any(ListObjectsV2Request.class)); //③OperateS3serviceクラスのgetObjectsSummariesを実行 List<S3ObjectSummary> res = target.getObjectsSummaries("bucket", "pre", 10); //④メインで実行した結果:resのサイズと0は同じかどうかを判定している。 assertEquals(res.size(), 0, ""); } |
ではテストコードの解説をしていきます。
1.インスタンスの作成
1 2 |
//①ListObjectV2Resultのインスタンスの作成 ListObjectsV2Result result = new ListObjectsV2Result(); |
2.モック化した変数の返り値設定
1 2 3 4 5 |
@Mock AmazonS3Client client; //② doReturn(result).when(client).listObjectsV2(any(ListObjectsV2Request.class)); |
このresultは①で使用されているものを使用しています。
3.メインコードの実行後、変数に代入
1 2 3 4 5 |
@InjectMocks public static OperateS3Service target = new OperateS3Service(); //③OperateS3serviceクラスのgetObjectsSummariesを実行 List<S3ObjectSummary> res = target.getObjectsSummaries("bucket", "pre", 10); |
1 2 3 4 5 6 7 8 9 10 11 12 |
public class <strong>OperateS3Service</strong> { ・・・ ・・・ public List<S3ObjectSummary> <strong>getObjectsSummaries</strong>(String bucketName, String prefix, int max) { ListObjectsV2Request req = new ListObjectsV2Request(); req.setBucketName(bucketName); req.setPrefix(prefix); req.setMaxKeys(10); ListObjectsV2Result result = s3.listObjectsV2(req); return result.getObjectSummaries(); } } |
4.同値判定
1 2 |
//④メインで実行した結果:resのサイズと0は同じかどうかを判定している。 assertEquals(res.size(), 0, ""); |
その変数resと0が同じ値なのかををassertEqualsによって判定しています。
コードまとめ
コードはテスト側で仮のデータを作り、それをメインコードで利用し、コードを進めていくイメージかと思います。
コードを書いてみて、最初は私も意味が分かりませんでした。
改めて自分の口で説明してみると理解につながると思います。
モック化などの説明がありますが、わからなくなったら「単体テストを動かしてみた①」をご覧になってください。
おわりに
単体テストの説明を行いました。
まずは簡単な箇所からやっていき、徐々に慣れていくことで、自分のものにできると思います。
今回はまだ一部のアノテーションしか使用していないので、今後また単体テスト等を行っていき、スキルとして身に着けていきたいと思います。
ご覧いただきありがとうございます。