MUnitを使ってみる

Muleアプリケーションのためのテストフレームワーク、MUnitを少し使ってみようと思います。

# 簡単なテストの作成
まずは、テストする簡単なフローを作成します。
![サンプルフローその１.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367531/15c23a12-22fb-e70c-bf4b-6635a74d2b6b.jpeg)
HTTP Listnerでリクエストを受け付けて、Payloadに「Hello World」をセットして応答するだけの簡単なアプリケーションとします。
続いてこのフローのテストを作成します。
Anypoint Studioのプロジェクトを右クリック > Mew > MUnit Testを指定します。
![MUnitテスト作成１.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367531/bb119026-8739-a276-16c0-de4fc83b2c81.jpeg)
「MUnit test suite」ダイアログボックスが表示されるので、先ほど作成したサンプルフローにチェックを入れて「Finish」ボタンを押下します。「Execution」でテスト対象のフローを呼び出すMUnitテストが作成されますので、結果の検証を行うため「Validation」に「Assert that」を追加します。
![MUnitテスト１.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367531/fec9c566-f4d6-034c-30c7-43a0a34f316a.jpeg)
「Assert that」のプロパティに以下を指定します。

* General> Expressionとして、#[payload]を指定
* Isで#[MunitTools::matches('Hello World')]

※ MunitToolsの使い方については以下あたりを参照してください。
https://docs.mulesoft.com/munit/2.1/munit-matchers

これで準備完了です。テストを右クリックして「Run MUnit test」を選択してください。
![結果1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367531/dc7d0388-9126-10c6-8333-0f75814a72df.jpeg)
テストが実施され成功します。
試しに比較する文字を「Stop World」に変更して実施してみてください。ちゃんとテストが失敗します。

# Mockを使用する
つづいて、モック機能を使用してみようと思います。
サンプルフローにHTTPリクエストするコネクターを追加します。
接続先は架空のものにします。
![モック1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367531/64fdc2cc-6078-feba-4f0e-d24eac572042.jpeg)
ここで一度テストを実施してみましょう。「Connection refused」のエラーが発生してテストは失敗します。
そこで、HTTPリクエストの結果をMock化して、何かしらの正常な値が返却するようにします。
![モック２.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367531/f80dfa53-1735-5e35-6229-dfbf094b2798.jpeg)
Behaviorに「Mock when」を配置し、以下を設定します。

* General > Processorに「http:request」
* Then returnを「Edit inline」
* Payloadにチェック
* Payload > Valueに#['Stop World']

ついでにAsert Thatの比較文字も「'Stop World'」に変更します。

![モック３.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367531/af40f882-bcae-8b7d-1a7c-634d81cb2a8d.jpeg)

テストを実施してください。テストが成功します。（Mockが設定されたため、HTTPのRequestコネクターで接続エラーとならず、結果として'Stop World'を返却されていたためです。）


# Spyを使用する
次にSpyを使用してみます。Spyはテスト対象のフロー内のあるイベントが呼ばれた前後の動作の検証が行える機能です。
まずは、サンプルフローを以下のように変更します。
![スパイ1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367531/b9498dcd-e764-db31-3ebe-0940670c1a34.jpeg)

* sub_flowを追加して、Set PayloadでPayloadを「Start World」に変更するようにします。
* メインフローからサブフローを呼び出すFlow Referenceを追加します。（Display Nameを「call sub_flow」としてください。）

次に、追加したこのFlow Referenceの前後のpayloadの値を検証するSpyをテストに追加します。
![スパイ2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367531/e4d36991-1c22-7b4a-c0f0-cd3b08e7a8a0.jpeg)

Spyの設定は以下のようになります。
![スパイ３.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367531/6ac2c9d0-d8c1-d56f-24bb-a7a9e16a1fca.jpeg)

Processorには「mule:flow-ref」と、「mule:」を指定します。
また、flow-refを特定する必要がある（テスト対象にはflow-refは一つしか配置されていないのですが、テスト時の呼び出しと区別する必要がある（？）ようです）ため、With attributesのEdit inlineで以下を指定します。

doc:name ＝ call sub_flow

最後にSpyのBefore、AfterにAssert thatを追加し、それぞれPayloadが「Stop World」、「Start World」になるかを確認するように指定してください。

テストを実施して、テストが通ることを確認してください。
また、念のためMockや、sub_flowの処理を変更して、Spyのテストが正しく動作しているかを確認してみてください。


# カバレッジの確認
最後にカバレッジレポートを作成します。
![カバレッジ１.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367531/c4701fd4-0026-7450-f095-779a764fb051.jpeg)
Munit CoverageというViewがありますので、そのViewの「Generate Report」ボタンを押してみてください。以下のようなHTML形式のレポートが生成されます。

![カバレッジ２.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367531/a85cd5c1-0a36-4ad7-2e7c-9f2e0c2e8bce.jpeg)

あまり、いいサンプルではないですが。。

# まとめ
以上で、MuleSoft Anypoint Platformのテストツール、MUnitの基本的な操作方法を簡単に説明してみました。
Flowと同様、慣れてしまえば割と簡単に自動テストが作れそうな感じがしますが、いかがでしょうか。