【Java】【S3】ListObjectsV2Request・ListObjectsV2Resultのmock

IT

やりたいこと

  • 下記を含むメソッドのユニットテスト
    • ListObjectsV2Request
    • ListObjectsV2Result
  • ListObjectsV2Request/Resultのmock化
  • 今回はmock化の確認に重点を置いてコードを書いた
  • 中でAmazonS3もmock化している

サンプルコード

  • 使ったもの
    • mockito
    • リフレクション

テスト対象クラス

  • AmazonS3をstaticフィールドに用意
    • ここもmock化するため、nullにしている
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.model.ListObjectsV2Request;
import com.amazonaws.services.s3.model.ListObjectsV2Result;
import com.amazonaws.services.s3.model.S3ObjectSummary;

import java.util.ArrayList;
import java.util.List;

public class getListFromS3Class {
    private static AmazonS3 s3Client = null;

    public List<String> getListFromS3(String bucketName, String prefix){
        // bucketName、prefixで取得オブジェクトを指定
        ListObjectsV2Request req = new ListObjectsV2Request().withBucketName(bucketName).withPrefix(prefix);
        // resultに指定したオブジェクトを格納
        ListObjectsV2Result result = s3Client.listObjectsV2(req);
        // Listで取得
        List<S3ObjectSummary> objects = result.getObjectSummaries();

        // ArrayListを用意、keyを格納
        List<String> resultList = new ArrayList<>();
        for(S3ObjectSummary os : objects){
            resultList.add(os.getKey());
        }

        // 格納したkeyのリストを返す
        return resultList;
    }
}

テストコード

import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.model.ListObjectsV2Request;
import com.amazonaws.services.s3.model.ListObjectsV2Result;
import com.amazonaws.services.s3.model.S3ObjectSummary;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

import static org.mockito.Matchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

public class getListFromS3ClassTest {
    @Test
    void testGetListFromS3() throws NoSuchFieldException, IllegalAccessException {
        String bucketName = "testBucketName";
        String prefix = "testPrefix";

        AmazonS3 s3Client = mock(AmazonS3.class);
        ListObjectsV2Result result = mock(ListObjectsV2Result.class);

        // フィールドs3Clientを設定
        getListFromS3Class getList = new getListFromS3Class();
        Field s3ClientField = getListFromS3Class.class.getDeclaredField("s3Client");
        s3ClientField.setAccessible(true);
        s3ClientField.set(getList, s3Client);

        // mockに入れるためのList<S3ObjectDumy>の作成
        // Listに入れるためのS3ObjectSummaryを定義
        S3ObjectSummary s3ObjSummaryDummy = new S3ObjectSummary();
        // 定義したS3ObjectSummaryにkeyを設定 -> この値がユニットテストで入るか確認する
        s3ObjSummaryDummy.setKey("test1");
        List<S3ObjectSummary> listDummy = new ArrayList<>();
        listDummy.add(s3ObjSummaryDummy);

        // s3Clientの返り値のmock化
        when(s3Client.listObjectsV2(any(ListObjectsV2Request.class))).thenReturn(result);
        // ListObjectsV2Resultの返り値のmock化
        when(result.getObjectSummaries()).thenReturn(listDummy);

        List<String> checkResult = getList.getListFromS3(bucketName, prefix);

        // 取得したlistの大きさが1か確認
        Assertions.assertEquals(1, checkResult.size());
        // 取得したlistの値が設定した"test1"か確認
        Assertions.assertEquals("test1", checkResult.get(0));

    }
}

テスト実行結果

Test Passedを確認

参考

補足

コメント

タイトルとURLをコピーしました