gRPC Mock in Go

Introduction

gRPC is a high-performance, open-source framework developed by Google for building distributed systems. It allows you to define services using Protocol Buffers (protobuf) and enables efficient communication between clients and servers. When developing gRPC applications, it is often necessary to simulate or mock certain behaviors to facilitate testing or to enable development in parallel. In this article, we will explore how to mock gRPC services in Go using a popular mocking library called mockgen.

Prerequisites

To follow along with the examples in this article, you should have a basic understanding of gRPC and Go programming. Make sure you have Go installed on your machine and have a working knowledge of Protocol Buffers (protobuf).

Setting up the Project

Let's start by setting up a new Go project. Create a new directory and initialize a Go module using the following command:

$ go mod init grpc-mock-example

Next, we need to install the necessary dependencies. Run the following command to install the required packages:

$ go get google.golang.org/grpc
$ go get github.com/golang/protobuf/proto
$ go get github.com/golang/mock/gomock
$ go get github.com/golang/mock/mockgen

Creating a gRPC Service

For the purpose of this article, let's assume we have a simple gRPC service that provides a method to create a user. Create a new file called user.proto and define the service and message types as shown below:

syntax = "proto3";

package user;

service UserService {
    rpc CreateUser(UserRequest) returns (UserResponse) {}
}

message UserRequest {
    string name = 1;
    string email = 2;
}

message UserResponse {
    string id = 1;
    string name = 2;
    string email = 3;
}

Next, generate the Go code from the user.proto file using the following command:

$ protoc -I . --go_out=plugins=grpc:. user.proto

This will generate a Go file called user.pb.go in the same directory.

Mocking the gRPC Service

To mock the gRPC service, we will use the mockgen tool provided by the github.com/golang/mock/mockgen package. mockgen generates mock implementations of interfaces based on the provided Go source code.

Create a new file called user_mock_test.go and add the following code:

package main

import (
	"testing"

	"github.com/golang/mock/gomock"
	"github.com/stretchr/testify/assert"
	mock_user "grpc-mock-example/mock"
)

func TestCreateUser(t *testing.T) {
	ctrl := gomock.NewController(t)
	defer ctrl.Finish()

	mockUserService := mock_user.NewMockUserServiceClient(ctrl)
	mockUserService.EXPECT().CreateUser(gomock.Any(), gomock.Any()).Return(&user.UserResponse{
		Id:    "1",
		Name:  "John Doe",
		Email: "john.doe@example.com",
	}, nil)

	// Code to test the CreateUser function
}

In the above code, we create a new instance of gomock.Controller and defer its Finish() method to ensure cleanup. We then create a mock implementation of the UserServiceClient interface using mock_user.NewMockUserServiceClient(ctrl).

Next, we define an expectation for the CreateUser method using mockUserService.EXPECT().CreateUser(gomock.Any(), gomock.Any()). This expectation specifies that when the CreateUser method is called on the mockUserService, it should return a predefined UserResponse object along with nil error.

At this point, you can write the actual code to test the CreateUser method. You can use the mockUserService you created above as a dependency within your test code.

Running the Tests

To run the test cases, execute the following command:

$ go test -v

This will execute the test cases and display the output. You should see the test output along with any assertions you have made using the assert package.

Conclusion

In this article, we explored how to mock gRPC services in Go using the mockgen tool. We learned how to create a mock implementation of a gRPC service client and define expectations for its methods. We also saw how to use the mock implementation in our test cases to simulate behaviors and assert the expected results.

Mocking gRPC services is essential for effective testing and development. By using mockgen and similar tools, you can easily create mock implementations of gRPC services and focus on testing your business logic without worrying about the underlying network communication.

References

  • [gRPC Documentation](
  • [Protocol Buffers Documentation](
  • [github.com/golang/mock](