【Day 14】BFF 環境構築 - WireMock

## はじめに

![スライド15.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985550/7c012c9e-a7ed-93cc-b402-acd5f8c5567f.png)

---

**2023年アドベントカレンダー14日目**です。

https://qiita.com/advent-calendar/2023/life-sync-app

前回からBFFの開発を始めるために環境構築をしています

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985550/e36b1dc4-814d-49b3-43bc-61c9f978400f.png)

## WireMock

### WireMockとは

WireMockは、モックサーバーを簡単に構築するためのツールです。
主にテストで使われて、実際のサーバーの代わりに動作し、APIのモックをすることができます。

https://wiremock.org

### Dockerで起動

wiremockはjava上で動作するアプリケーションなので、javaのimageを使って構築していきます

```Dockerfile:Dockerfile
FROM openjdk:8-jre-alpine

ENV WIREMOCK_VERSION 2.27.2

RUN wget https://repo1.maven.org/maven2/com/github/tomakehurst/wiremock-standalone/${WIREMOCK_VERSION}/wiremock-standalone-${WIREMOCK_VERSION}.jar -O wiremock-standalone.jar

EXPOSE 8080

ENTRYPOINT ["java", "-jar", "wiremock-standalone.jar"]
```

モックしたい情報を./mappings/*に設置します

```json:mock_get_blogs.json
{
  "request": {
    "method": "GET",
    "url": "/blogs"
  },
  "response": {
    "status": 200,
    "headers": {
      "Content-Type": "application/json"
    },
    "jsonBody": {
      "blogs": [
        {
          "id": "8c7cf457-5ffe-44c3-98b3-c529c09e9999",
          "title": "title1",
          "author": "author1",
          "body": "body1",
          "createdAt": "2019-01-01T00:00:00.000Z"
        }
      ]
    }
  }
}

```

起動してみます

```bash
#!/bin/bash

# イメージをビルドする
docker build -t wiremock .

# コンテナを実行する
docker run -it --rm -p 8080:8080 -v "$(pwd)/mappings:/mappings" --name wiremock wiremock
```

:::note info

Dockerのみでも十分動きますが、一応docker composeでも動くようにcompose.yamlファイルを載せておきます

```yaml:compose.yaml
version: '3'

services:
  app:
    build: .
    ports:
      - '8080:8080'
    volumes:
      - './mappings/:/mappings'
    tty: true
    stdin_open: true
```

```bash
docker compose up
```
:::

では起動していきます

```bash
$ docker run -it --rm -p 8080:8080 -v "$(pwd)/mappings:/mappings" --name wiremock wiremock

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
 /$$      /$$ /$$                     /$$      /$$                     /$$      
| $$  /$ | $$|__/                    | $$$    /$$$                    | $$      
| $$ /$$$| $$ /$$  /$$$$$$   /$$$$$$ | $$$$  /$$$$  /$$$$$$   /$$$$$$$| $$   /$$
| $$/$$ $$ $$| $$ /$$__  $$ /$$__  $$| $$ $$/$$ $$ /$$__  $$ /$$_____/| $$  /$$/
| $$$$_  $$$$| $$| $$  \__/| $$$$$$$$| $$  $$$| $$| $$  \ $$| $$      | $$$$$$/ 
| $$$/ \  $$$| $$| $$      | $$_____/| $$\  $ | $$| $$  | $$| $$      | $$_  $$ 
| $$/   \  $$| $$| $$      |  $$$$$$$| $$ \/  | $$|  $$$$$$/|  $$$$$$$| $$ \  $$
|__/     \__/|__/|__/       \_______/|__/     |__/ \______/  \_______/|__/  \__/

port:                         8080
enable-browser-proxying:      false
disable-banner:               false
no-request-journal:           false
verbose:                      false
```

起動しました 👍

ではマッピングを確認してみましょう

:::note info
`/__admin/mappings`で登録されているマッピングを確認できます。
:::

```bash
$ curl http://localhost:8080/__admin/mappings | jq .
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   619    0   619    0     0   276k      0 --:--:-- --:--:-- --:--:--  302k

{
  "mappings": [
    {
      "id": "2b7edb61-beec-4ad7-bab5-a430f6871278",
      "request": {
        "url": "/blogs",
        "method": "GET"
      },
      "response": {
        "status": 200,
        "jsonBody": {
          "blogs": [
            {
              "id": "8c7cf457-5ffe-44c3-98b3-c529c09e9999",
              "title": "title1",
              "author": "author1",
              "body": "body1",
              "createdAt": "2019-01-01T00:00:00.000Z"
            }
          ]
        },
        "headers": {
          "Content-Type": "application/json"
        }
      },
      "uuid": "2b7edb61-beec-4ad7-bab5-a430f6871278"
    }
  ],
  "meta": {
    "total": 1
  }
}
```

`/blogs`にマッピングされていることが確認できましたので、リクエストを送ってみます。

```bash
$ curl http://localhost:8080/blogs | jq .
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   147    0   147    0     0  32967      0 --:--:-- --:--:-- --:--:-- 36750
{
  "blogs": [
    {
      "id": "8c7cf457-5ffe-44c3-98b3-c529c09e9999",
      "title": "title1",
      "author": "author1",
      "body": "body1",
      "createdAt": "2019-01-01T00:00:00.000Z"
    }
  ]
}
```

いい感じですね👍

これでBFFの開発を進められるので、こちらのストーリーはDoneになりました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985550/e36b1dc4-814d-49b3-43bc-61c9f978400f.png)

次回からは実際にBFFの実装を進めていきます