きっかけ
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も同様の方法でテストできるかと思います。