Skip to content
This repository has been archived by the owner on Jul 4, 2024. It is now read-only.

Latest commit

 

History

History

mocking

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 

Mocking

Thie example demonstrates how to mock the helloworld service

The generated protos create a Service interface used by the client. This can simply be mocked.

type GreeterService interface {
	Hello(ctx context.Context, in *Request, opts ...client.CallOption) (*Response, error)
}

Where the GreeterService is used we can instead pass in the mock which returns the expected response rather than calling a service.

Mock Client

type mockGreeterService struct {
}

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

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

Use Mock

In the test environment we will use the mock client

func main() {
	var c proto.GreeterService

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

	service.Init(
		micro.Action(func(ctx *cli.Context) error {
			env := ctx.String("environment")
			// use the mock when in testing environment
			if env == "testing" {
				c = mock.NewGreeterService()
			} else {
				c = proto.NewGreeterService("helloworld", service.Client())
			}
                        return nil
		}),
	)

	// call hello service
	rsp, err := c.Hello(context.TODO(), &proto.Request{
		Name: "John",
	})
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(rsp.Greeting)
}