LoginSignup
2
3

More than 3 years have passed since last update.

AWS APIをコールするコード(Java)のテストコード(Junit & mockit)を書いてみた

Last updated at Posted at 2019-06-14

きっかけ

AWSのCloudFormationのスタックステータスをチェックするプログラムを組んでいた。
返却されるステータス毎に処理が異なる為、全てのステータスをテストする必要がある。

課題

AWSのCloudFormationのスタックのステータスはこちらでコントロールできない。

どーやってテストするの?

Junitでテストコードを書いて、
その中でAPIが返却するステータスを指定(モック化)することにしました。

テストしたい部分

下記がテスト対象のコード部分

describeStacks.java
/*CloudFormationのAPI実行用のクライアント作成*/
AmazonCloudFormationAsync CFclient = AmazonCloudFormationAsyncClientBuilder.standard()
        .withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials("hope", "huga")))
        .build();

/* DescribeStacksする対象のスタック名を指定 */
DescribeStacksRequest describeStacksRequest = new DescribeStacksRequest();
describeStacksRequest.withStackName("hogestack");

/* ここでスタックの状態取得するAPI(describeStacks)を実行(モック化したい場所) */
DescribeStacksResult describeStacksResult = CFclient.describeStacks(describeStacksRequest);

モック化

describeStacksTest.java
@RunWith(MockitoJUnitRunner.class)
public class describeStacksTest {

    /* モック化するクラスを宣言 */
    @Mock AmazonCloudFormationAsync AmazonCloudFormationMock;
    /* モック化するクラスを注入する先のクラスを指定 */
    @InjectMocks describeStacksClass describeStacks = new describeStacksClass();

    @Before
    public void init() {
        /* モックの初期化 */
        MockitoAnnotations.initMocks(this);
    }
    @Test
    public void スタックステータスの制御() {
        /* describeStacks実行時の返り値のクラスを作成 */
        DescribeStacksResult describeStacksResult = new DescribeStacksResult();
        Stack stacks = new Stack();
        stacks.setStackStatus(StackStatus.CREATE_COMPLETE); //StackStatusを設定(今回はCREATE_COMPLETEのステータスを指定)
        describeStacksResult.withStacks(stacks);

        /* テスト対象が実行する引数と同じ引数のクラスを作成 */
        DescribeStacksRequest describeStacksRequest = new DescribeStacksRequest();
        describeStacksRequest.withStackName("hogestack");

        /* モック化されたクラスのdescribeStacks実行時の引数と返り値を指定 */
        when(AmazonCloudFormationMock.describeStacks(DescribeStacksRequest)).thenReturn(describeStacksResult);

所感

AmazonCloudFormationAsyncのクラスがpublicだった為、あっさりとモック化してくれました。
APIとして提供されているクラスである為、publicなのでモック化も容易でした。
Resule系のクラスにもちゃんとセッターが容易してあるのはさすが(AWSはモック化、スタブ化される事を予想していた?)
他のAPIも同様の方法でテストできるかと思います。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3