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)
}