go-micro examples 中mocking 代碼學習(爲方面分工開發 或測試 mock調用微服務)

對應 examples/mocking 例子

這個例子 展示 了 如何 mock 調用 微服務。

目錄如下:

helloworld  :  helloworld 微服務,(可假設下這是由項目中其他人開發,維護,我們只是調用)

helloworld/proto/greeter.proto 代碼如下:

syntax = "proto3";

service Greeter {
    rpc Hello(HelloRequest) returns (HelloResponse) {}
}

message HelloRequest {
    string name = 1;
}

message HelloResponse {
    string greeting = 2;
}

helloworld/main.go 代碼如下:

package main

import (
	"context"
	"github.com/micro/go-micro"
	"log"
	proto "mocking/helloworld/proto"
)

type Greeter struct{}

func (g *Greeter) Hello(ctx context.Context, req *proto.HelloRequest, rsp *proto.HelloResponse) error {
	rsp.Greeting = "Hello " + req.Name

	return nil
}

func main() {
	service := micro.NewService(
		micro.Name("helloworld"),
	)

	service.Init()

	proto.RegisterGreeterHandler(service.Server(), new(Greeter))

	if err := service.Run(); err != nil {
		log.Fatal(err)
	}
}

mock/mock.go 代碼如下:

package mock

import (
	"context"
	"github.com/micro/go-micro/client"
	proto "mocking/helloworld/proto"
)

type mockGreeterService struct{}

func (m *mockGreeterService) Hello(ctx context.Context, req *proto.HelloRequest, opts ...client.CallOption) (*proto.HelloResponse, error) {
	return &proto.HelloResponse{
		Greeting: "Hello test ::" + req.Name,
	}, nil
}

func NewGreeterService() proto.GreeterService {
	return new(mockGreeterService)
}

main.go  代碼如下 (rpc client)

package main

import (
	"context"
	"fmt"
	"github.com/micro/cli"
	"github.com/micro/go-micro"
	proto "mocking/helloworld/proto"
	"mocking/mock"
)

func main() {
	var c proto.GreeterService

	service := micro.NewService(
		micro.Flags(cli.StringFlag{
			Name:  "environment",
			//Value: "testing",
			Value: "",
		}),
	)

	service.Init(
		micro.Action(func(ctx *cli.Context) {
			env := ctx.String("environment")

			//在 測試環境中 使用 mock
			if env == "testing" {
				c = mock.NewGreeterService()
			} else {
				c = proto.NewGreeterService("helloworld", service.Client())
			}
		}),
	)

	//調用 hello service
	rsp, err := c.Hello(context.TODO(), &proto.HelloRequest{
		Name: "John",
	})

	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(rsp.Greeting)
}

go.mod 內容如下:

module mocking

go 1.13

require (
	github.com/golang/protobuf v1.3.2
	github.com/micro/go-micro v1.18.0
)

運行:

運行 helloworld 微服務

go run helloworld/main.go

bogon:mocking zhaozhiliang$ go run main.go --environment testing

Hello test ::John

bogon:mocking zhaozhiliang$ go run main.go

Hello John

 

 

發佈了161 篇原創文章 · 獲贊 34 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章