やりたいこと
- 下記を含むメソッドのユニットテスト
- ListObjectsV2Request
- ListObjectsV2Result
- ListObjectsV2Request/Resultのmock化
- 今回はmock化の確認に重点を置いてコードを書いた
- 中でAmazonS3もmock化している
- ここのmock化については【Java】【AWS】staticなAmazonS3をmockを参照
サンプルコード
- 使ったもの
- mockito
- リフレクション
テスト対象クラス
AmazonS3
をstaticフィールドに用意- ここもmock化するため、
null
にしている
- ここもmock化するため、
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
を確認
コメント