Note: This is a modified version of matryer/moq.
The following major modifications were applied:
- Declare package import paths using the non-vendored notation; allowing the Go
compiler to compile the mock source files without any further manual
post-editing; including support for build tags. (ca23463, 1faeabd, 44c3e2a, 782c95e)
- Apply
goimports
(instead of gofmt
) on generated source; allowing
configured strict linters to accept the mock source files. (ed4df3d)
- Support same package name for mock and types used in mock(62e06d1, c20b2d5)
- Support empty
GOPATH
(a85236d)
- Assert that mock implementation always fully satisfies the interface.
(a870503)
- Generate non-executable go source files; addressing a potential security risk.
(8385b56)
- Remove tool name from
panic
output; reducing a reader's confusion when
panic
s occur. (a781a2e)
moq

Interface mocking tool for go generate.
By Mat Ryer and David Hernandez, with ideas lovingly stolen from Ernesto Jimenez.
What is Moq?
Moq is a tool that generates a struct from any interface. The struct can be used in test code as a mock of the interface.

above: Moq generates the code on the right.
You can read more in the Meet Moq blog post.
Installing
To start using Moq, just run go get:
$ go get github.com/matryer/moq
Usage
moq [flags] destination interface [interface2 [interface3 [...]]]
-out string
output file (default stdout)
-pkg string
package name (default will infer)
In a command line:
$ moq -out mocks_test.go . MyInterface
In code (for go generate):
package my
//go:generate moq -out myinterface_moq_test.go . MyInterface
type MyInterface interface {
Method1() error
Method2(i int)
}
Then run go generate
for your package.
How to use it
Mocking interfaces is a nice way to write unit tests where you can easily control the behaviour of the mocked object.
Moq creates a struct that has a function field for each method, which you can declare in your test code.
This this example, Moq generated the EmailSenderMock
type:
func TestCompleteSignup(t *testing.T) {
var sentTo string
mockedEmailSender = &EmailSenderMock{
SendFunc: func(to, subject, body string) error {
sentTo = to
return nil
},
}
CompleteSignUp("me@email.com", mockedEmailSender)
callsToSend := len(mockedEmailSender.SendCalls())
if callsToSend != 1 {
t.Errorf("Send was called %d times", callsToSend)
}
if sentTo != "me@email.com" {
t.Errorf("unexpected recipient: %s", sentTo)
}
}
func CompleteSignUp(to string, sender EmailSender) {
// TODO: this
}
The mocked structure implements the interface, where each method calls the associated function field.
Tips
- Keep mocked logic inside the test that is using it
- Only mock the fields you need
- It will panic if a nil function gets called
- Name arguments in the interface for a better experience
- Use closured variables inside your test function to capture details about the calls to the methods
- Use
.MethodCalls()
to track the calls
- Use
go:generate
to invoke the moq
command
License
The Moq project (and all code) is licensed under the MIT License.
The Moq logo was created by Chris Ryer and is licensed under the Creative Commons Attribution 3.0 License.