13.5 ウェブサーバーのハンドラーをテストする

Javaの全盛期に広く議論された「アーキテクチャ」の多くは、特定のフレームワークへの依存を減らし、いつでも乗り換えられるようにしましょうというものがほとんどです。実際に乗り換えることは多くありませんが、Goの場合は、標準ライブラリとして提供されているnet/httpのサーバーやクライアントの仕組みが高性能で、どのフレームワークもこの標準ライブラリの上に構築されています。そういう意味ではどのフレームワークを選んでも大きな違いはなく、特定のフレームワークから独立させるためのレイヤーを手作りするメリットもあまりないのが特徴です。

Javaに限りませんが、特定のフレームワークへの依存を除去したアーキテクチャで実現したいことの1つがテストです。Goの場合はフレームワークの外側からリクエストを送信する仕組みが言語に備わっており、これを使ってテストすることによって、HTTPサーバーのEnd-to-Endのテストが簡単になります。

13.5.1 サーバー全体のテスト

次のようなコードがあるとします。同じ関数の中でルーター(http.Handlerインタフェース)を作ってサーバーを起動しています。これをまず分離します。

r := chi.NewRouter()
r.Get("/fortune", func(w http.ResponseWriter, r *http.Request) {
    w.Header().Add("Content-Type", "application/json")
    io.WriteString(w, `{"fortune": "大吉"}`)
})
log.Println(http.ListenAndServe(