package http import ( "context" "net/http" "testing" "github.com/gorilla/mux" ) type HelloRequest struct { Name string `json:"name"` } type HelloReply struct { Message string `json:"message"` } type GreeterService struct { } func (s *GreeterService) SayHello(ctx context.Context, req *HelloRequest) (*HelloReply, error) { return &HelloReply{Message: "hello " + req.Name}, nil } func newGreeterHandler(srv *GreeterService, opts ...HandleOption) http.Handler { h := DefaultHandleOptions() for _, o := range opts { o(&h) } r := mux.NewRouter() r.HandleFunc("/helloworld", func(w http.ResponseWriter, r *http.Request) { var in HelloRequest if err := h.Decode(r, &in); err != nil { h.Error(w, r, err) return } next := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.SayHello(ctx, &in) } if h.Middleware != nil { next = h.Middleware(next) } out, err := next(r.Context(), &in) if err != nil { h.Error(w, r, err) return } if err := h.Encode(w, r, out); err != nil { h.Error(w, r, err) } }).Methods("POST") return r } func TestHandler(t *testing.T) { s := &GreeterService{} _ = newGreeterHandler(s) }