テストが簡単になるように、akka-httpを使用してREST APIを設計するにはどうすればよいですか?

ニキータ・リヤノフ

単純なREST-APIがあります。各APIサブパスには、独自のサービス実装があります。

問題は、それを正しくテストする方法です。

例:

class RestAPI(implicit dispatcher: ExecutionContext)  // some services need its own dispatcher
extends FirstService with SecondService with etc... { 
  val api: Route = pathPrefix("api") {
    get {
      firstService()
    } ~ post {
      secondService()
    } ~ ...
  }

  def start(implicit system: ActorSystem, materializer: ActorMaterializer): Unit = {
    Http().bindAndHandle(api, "host", 8080)
  }
}

object RestAPI {
  def apply(implicit dispatcher: ExecutionContext): RestAPI = new RestAPI
}

この場合、モックする必要がある実行コンテキストとサービス実装の依存関係のため、エンドポイントをテストできません。テストケースでRestApiの独自の実装を作成できますが、実際のRestApi内で何かを変更するたびに更新する必要があります

私は別の方法を試しました:

class RestAPI(implicit dispatcher: ExecutionContext)  { // some services need its own dispatcher
  this: FirstService with SecondService with etc... =>
  val api: Route = pathPrefix("api") {
    get {
      firstService()
    } ~ post {
      secondService()
    } ~ ...
  }

  def start(implicit system: ActorSystem, materializer: ActorMaterializer): Unit = {
    Http().bindAndHandle(api, "host", 8080)
  }
}

object RestAPI {
  def apply(implicit dispatcher: ExecutionContext): RestAPI = new RestAPI extends DefaultFirstService with DefaultSecondService with etc...
}


Test {
  val api = (new RestApi(dispatcher) extends StubOne with StubTwo with ...).api
}

この場合、少なくとも、すべてのエンドポイントをテストできますが、ルートを取得する前に、実行コンテキストを渡してRestApiオブジェクトをビルドする必要があります。また、これは最善の解決策ではありません。これを書く必要があり、new RestApi(dispatcher) extends StubOne with StubTwo with ...サービスが1つまたは2つある場合は問題ありませんが、3つ以上ある場合は、少し厄介に見えます(私の意見では)。

私がこのアプローチを試したより:

class RestAPI(serviceOne: FirstService, serviceTwo: SecondService, ...)(implicit dispatcher: ExecutionContext)  { // some services need its own dispatcher
  val api: Route = pathPrefix("api") {
    get {
      serviceOne.firstService()
    } ~ post {
      serviceTwo.secondService()
    } ~ ...
  }

  def start(implicit system: ActorSystem, materializer: ActorMaterializer): Unit = {
    Http().bindAndHandle(api, "host", 8080)
  }
}

object RestAPI {
  def apply(serviceOne: FirstService, serviceTwo: SecondService, ...)(implicit dispatcher: ExecutionContext): RestAPI = new RestAPI(serviceOne, serviceTwo, ...)
}


Test {
  val api = (new RestApi(...)(dispatcher)).api
}

おそらく、これが最も一般的なアプローチですが、それでも実行コンテキストを渡す必要があります。

それで、主な質問は、サービスの実装に依存しているが、それらのサービスの実際の実装がないエンドポイントをどのようにテストするかです。実装設計に問題があるのではないかと思いますが、それでも変更できます。質問:どのアプローチを選択する必要がありますか?

ブルーノ

実行するには実行コンテキストが必要だと思うHttp().bindAndHandle(api, "host", 8080)ので、別のクラスで実行します。

そうする場合は、アプローチ#3を使用し、mockito-scalaを使用して依存関係のモックを提供し、のインスタンスが完全に構築されRestAPIたら、httpバインディングコードを移動した場所に渡すだけです。

要約すると、API定義をHttp Serverの初期化から分離し、依存関係をモックして満足してください。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

画像の下に簡単なテキストを追加するにはどうすればよいですか?

分類Dev

Windowsで簡単なAPIリクエストを実行するにはどうすればよいですか?

分類Dev

anglejsを使用して簡単な計算機を作成するにはどうすればよいですか?

分類Dev

REST-複合キーを使用してURIを設計するにはどうすればよいですか?

分類Dev

後で簡単に列を追加できるようにcassandraスキーマを設計するにはどうすればよいですか?

分類Dev

Blackberryコードを簡単に単体テストするにはどうすればよいですか?

分類Dev

required_onceを使用せずにpicoCMSに基づいて簡単なプラグインを設計するにはどうすればよいですか?

分類Dev

Windows 10でマイクを簡単にテストするにはどうすればよいですか?

分類Dev

Railsに簡単な通知システムを実装するにはどうすればよいですか?

分類Dev

異なる列の値を簡単に合計するにはどうすればよいですか?

分類Dev

Xray Rest APIを使用してテスト実行をテスト計画に追加するにはどうすればよいですか?

分類Dev

netcatを使用して簡単なチャットを作成するにはどうすればよいですか?

分類Dev

簡単なjQueryスクリプトをWordPressに追加するにはどうすればよいですか?

分類Dev

システム設計:結果の非同期クエリを可能にするRESTful APIを設計するにはどうすればよいですか

分類Dev

2要素認証(2FA)を使用してステートレスRESTログインを設計するにはどうすればよいですか?

分類Dev

簡単な通知システムを実装するにはどうすればよいですか?

分類Dev

mySQLで簡単なSQLリクエストを作成するにはどうすればよいですか?

分類Dev

Haskellで簡単な計算機を作成するにはどうすればよいですか?

分類Dev

簡単なスクリプトをロードするにはどうすればよいですか?

分類Dev

FlutterでScaflodを使用せずに画面に簡単なテキストを表示するにはどうすればよいですか?

分類Dev

Rails APIの設計と実装を開始するにはどうすればよいですか?

分類Dev

簡単なファイルサーバーを設定するにはどうすればよいですか?

分類Dev

Automation Anywhereを使用してUIを設計するにはどうすればよいですか?

分類Dev

コントローラーテストで簡単なテストスパイを使用するにはどうすればよいですか?

分類Dev

REST APIで現在のユーザーからデータを返すようにURLを設計するにはどうすればよいですか?

分類Dev

REST APIを使用してAtlassianConfluenceにコメントを投稿するにはどうすればよいですか?

分類Dev

SQLでカテゴリのスキーマを設計するにはどうすればよいですか?

分類Dev

Bazelを使用してこの簡単な例を作成するにはどうすればよいですか?

分類Dev

Firebaseで簡単なAPIを作成するにはどうすればよいですか?

Related 関連記事

  1. 1

    画像の下に簡単なテキストを追加するにはどうすればよいですか?

  2. 2

    Windowsで簡単なAPIリクエストを実行するにはどうすればよいですか?

  3. 3

    anglejsを使用して簡単な計算機を作成するにはどうすればよいですか?

  4. 4

    REST-複合キーを使用してURIを設計するにはどうすればよいですか?

  5. 5

    後で簡単に列を追加できるようにcassandraスキーマを設計するにはどうすればよいですか?

  6. 6

    Blackberryコードを簡単に単体テストするにはどうすればよいですか?

  7. 7

    required_onceを使用せずにpicoCMSに基づいて簡単なプラグインを設計するにはどうすればよいですか?

  8. 8

    Windows 10でマイクを簡単にテストするにはどうすればよいですか?

  9. 9

    Railsに簡単な通知システムを実装するにはどうすればよいですか?

  10. 10

    異なる列の値を簡単に合計するにはどうすればよいですか?

  11. 11

    Xray Rest APIを使用してテスト実行をテスト計画に追加するにはどうすればよいですか?

  12. 12

    netcatを使用して簡単なチャットを作成するにはどうすればよいですか?

  13. 13

    簡単なjQueryスクリプトをWordPressに追加するにはどうすればよいですか?

  14. 14

    システム設計:結果の非同期クエリを可能にするRESTful APIを設計するにはどうすればよいですか

  15. 15

    2要素認証(2FA)を使用してステートレスRESTログインを設計するにはどうすればよいですか?

  16. 16

    簡単な通知システムを実装するにはどうすればよいですか?

  17. 17

    mySQLで簡単なSQLリクエストを作成するにはどうすればよいですか?

  18. 18

    Haskellで簡単な計算機を作成するにはどうすればよいですか?

  19. 19

    簡単なスクリプトをロードするにはどうすればよいですか?

  20. 20

    FlutterでScaflodを使用せずに画面に簡単なテキストを表示するにはどうすればよいですか?

  21. 21

    Rails APIの設計と実装を開始するにはどうすればよいですか?

  22. 22

    簡単なファイルサーバーを設定するにはどうすればよいですか?

  23. 23

    Automation Anywhereを使用してUIを設計するにはどうすればよいですか?

  24. 24

    コントローラーテストで簡単なテストスパイを使用するにはどうすればよいですか?

  25. 25

    REST APIで現在のユーザーからデータを返すようにURLを設計するにはどうすればよいですか?

  26. 26

    REST APIを使用してAtlassianConfluenceにコメントを投稿するにはどうすればよいですか?

  27. 27

    SQLでカテゴリのスキーマを設計するにはどうすればよいですか?

  28. 28

    Bazelを使用してこの簡単な例を作成するにはどうすればよいですか?

  29. 29

    Firebaseで簡単なAPIを作成するにはどうすればよいですか?

ホットタグ

アーカイブ