Go mocks

For some tests it is helpful to mock an interface. The gomock library should be used.

Adding mocked interface

Assume that you want to mock an interface Foo and Bar that are defined in the directory go/lib/foo. First, you need to create the subdirectory go/lib/foo/mock_foo. Inside this subdirectory, we add the build bazel file BUILD.bazel. We need to add a gomock target in this BUILD.bazel file for our interfaces. This would look like the following:

load("@io_bazel_rules_go//go:def.bzl", "gomock")
gomock(
    name = "go_default_mock",
    out = "mock.go",
    interfaces = [
        "Foo",
        "Bar",
    ],
    library = "//pkg/foo:go_default_library",
    package = "mock_foo",
)

For an example, refer to this example file. For further information on the gomock bazel rules, refer to gomock for Bazel.

After making the aforementioned changes, we need to run the following command form the root of the repository:

make mocks

This will create a mock file; for instance, in the above example this file will be /go/lib/foo/mock_foo/mock.go.

Updating generated mocks

One can delete or add new interfaces to the BUILD.bazel file and then run make mocks to update the corresponding mock.go files.