質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JUnit

JUnitは、Javaで開発されたプログラムのユニットテストを行うためのアプリケーションフレームワークです。簡単にプログラムのユニットテストを自動化することができ、結果もわかりやすく表示されるため効率的に開発時間を短縮できます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Amazon S3

Amazon S3 (Simple Storage Service)とはアマゾン・ウェブ・サービスが提供するオンラインストレージサービスです。

Q&A

解決済

1回答

1174閲覧

JUnitでAmazon S3 Clientの返却値を指定したい

yamame01

総合スコア16

JUnit

JUnitは、Javaで開発されたプログラムのユニットテストを行うためのアプリケーションフレームワークです。簡単にプログラムのユニットテストを自動化することができ、結果もわかりやすく表示されるため効率的に開発時間を短縮できます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Amazon S3

Amazon S3 (Simple Storage Service)とはアマゾン・ウェブ・サービスが提供するオンラインストレージサービスです。

0グッド

0クリップ

投稿2023/02/08 23:53

編集2023/02/08 23:56

ご覧頂き、ありがとうございます!

実現したいこと

Amazon S3Clientを利用したソースコードのテストを作成しています。
S3Client.listObjects()の返却値によって、後続処理で分岐している箇所のテストを行いたいですが、どのように返却値を指定すればいいのかわからないためご教授いただければ幸いです。

該当のソースコード

テスト対象クラス

Java

1public class TargetClass { 2 @Autowired 3 private S3Client s3Client; 4 5 public String mainMethod(String bucketName, String prefix) { 6 ListObjectsResponse objectList = listObjects(bucketName, prefix); 7 List<S3Object> s3Object = objectList.contents(); 8 9 if (s3Object.isEmpty()) { 10 return "object is empty"; 11 } else { 12 return "object is NOT empty"; 13 } 14 } 15 16 private ListObjectsResponse listObjects(String bucketName, String prefix) { 17 ListObjectsRequest listObjectsRequest = ListObjectsRequest 18 .builder() 19 .bucket(bucketName) 20 .prefix(prefix) 21 .build(); 22 23 LOGGER.info("List file from S3 for prefix: {}/{}", bucketName, prefix); 24 try { 25 return s3Client.listObjects(listObjectsRequest); 26 } catch (SdkServiceException ase) { 27 LOGGER 28 .error( 29 "List file request for prefix: {}, was rejected with an error", 30 prefix); 31 throw new CustomException(ase); 32 } catch (SdkClientException ace) { 33 LOGGER 34 .error( 35 "Client encountered an internal error while trying to communicate with STaaS for list file request with prefix {}", 36 prefix); 37 throw new CustomException(ase); 38 } 39 } 40}

テストクラス

Java

1@RunWith(PowerMockRunner.class) 2public class TestTargetClass { 3 4 @Mock 5 S3Client s3ClientMock; 6 7 @InjectMocks 8 TargetClass _target; 9 10 @Test 11 public void test1() throws Exception { 12 // S3Object がEmptyの場合 13 String bucketName = "bucketName"; 14 String prefix = "prefix"; 15 16 when(s3ClientMock.listObjects(any())).thenReturn(); // contentsがnullのListObjectsResponseを生成して返却したい 17 String actual = _target.mainMethod(bucketName, prefix); 18 19 assertThat(actual, is("object is empty"); 20 } 21 22 @Test 23 public void test2() throws Exception { 24 // S3Object がEmptyではない場合 25 String bucketName = "bucketName"; 26 String prefix = "prefix"; 27 28 when(s3ClientMock.listObjects(any())).thenReturn(); // contentsがnullではないListObjectsResponseを生成して返却したい 29 String actual = _target.mainMethod(bucketName, prefix); 30 31 assertThat(actual, is("object is Not empty"); 32 } 33}

試したこと

Java

1/** 2* ListObjectsResponseをinstance化 3*/ 4ListObjectsResponse response = new ListObjectsResponse(); 5// 'ListObjectsResponse(software.amazon.awssdk.services.s3.model.ListObjectsResponse.BuilderImpl)' has private access in 'software.amazon.awssdk.services.s3.model.ListObjectsResponse'

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

S3Clientを利用しているTargetClassをテストする際、S3Client.listObjects()の返却値を制御する必要があります。

次のようにS3Clientをモック化して、S3Client.listObjects()の返却値を指定することができます。

@Mock S3Client s3ClientMock; @InjectMocks TargetClass _target; ... when(s3ClientMock.listObjects).thenReturn(指定したいListObjectsResponse);

ここで、指定したいListObjectsResponseは、contentsがemptyかどうかによって異なります。

test1()では、emptyのListObjectsResponseを生成して返却させます。

@Test public void test1() throws Exception { // S3Object がemptyの場合 ... when(s3ClientMock.listObjects).thenReturn(emptyのListObjectsResponse); String actual = _target.mainMethod(bucketName, prefix); assertThat(actual, is("object is empty"); }

test2()では、emptyではないListObjectsResponseを生成して返却させます。

@Test public void test2() throws Exception { // S3Object がemptyではない場合 ... when(s3ClientMock.listObjects).thenReturn(emptyではないListObjectsResponse); String actual = _target.mainMethod(bucketName, prefix); assertThat(actual, is("object is Not empty"); }

投稿2023/02/09 00:04

somak

総合スコア24

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yamame01

2023/02/09 00:17

コメントありがとうございます!! >emptyのListObjectsResponse >emptyではないListObjectsResponse はそれぞれどのように生成すればいいのでしょうか?
somak

2023/02/09 00:47

JavaでemptyのListObjectsResponseを生成するには、以下のようにします。 ``` ListObjectsResponse emptyResponse = ListObjectsResponse .builder() .contents(Collections.emptyList()) .build(); ``` ここで、Collections.emptyList()は空のリストを生成するためのメソッドです。 emptyではないListObjectsResponseを生成するには、S3Objectを含むListObjectsResponseインスタンスを生成する必要があります。 例: ``` List<S3Object> s3Objects = new ArrayList<>(); s3Objects.add(new S3Object("key1", "value1")); s3Objects.add(new S3Object("key2", "value2")); ListObjectsResponse response = ListObjectsResponse.builder().contents(s3Objects).build(); ``` このように、必要な数のS3Objectを含むListを作成して、それをcontentsとして持つListObjectsResponseインスタンスを生成することができます。
yamame01

2023/02/09 02:46

Collections.emptyList() は初めて知りました! 教えていただいた方法で、正しくテストすることができました。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問