Updated 2022-12-22
| gomock | testify + mockery | minimock | moq | |
|---|---|---|---|---|
| GitHub stars | ||||
| Latest release date | ||||
| Maintained | ✅ | ✅ | ✅ | ✅ |
| Code generation 1 | ✅ | ✅ | ✅ | ✅ |
| Not only code generation 2 | ❌ | ✅ | ❌ | ❌ |
Use t.Cleanup() 3 |
✅ | ✅ | ❌ | ❌ |
| Support generics | ❌ | ✅ | ❌ | ✅ |
| Execute custom func 4 | ✅ | ✅ | ✅ | ✅ |
| Typed expected arguments 5 | ✖️ | ✖️ | ✔️ | ✔️ |
| Typed returned values 6 | ✖️ | ✔️ | ✔️ | ✔️ |
| Calls order 7 | ✅ | ✅ | ❌ | ❌ |
Wait for time.Duration 8 |
❌ | ✅ | ❌ | ❌ |
Wait for message from chan 9 |
❌ | ✅ | ❌ | ❌ |
| Panic 10 | ❌ | ✅ | ❌ | ❌ |
| Assert expectations with timeout | ❌ | ❌ | ✅ | ❌ |
| Return zero values by default 11 | ✅ | ❌ | ❌ | ❌ |
| Exact calls count 12 | ✅ | ✅ | ❌ | ❌ |
| Min/max calls count 13 | ✅ | ❌ | ❌ | ❌ |
| Any positive calls count | ✅ | ❌ | ✅ | ❌ |
| Any calls count | ✅ | ✅ | ❌ | ❌ |
| Expect once by default 14 | ✅ | ❌ | ❌ | ❌ |
| Any value | ✅ | ✅ | ❌ | ❌ |
| Equal to | ✅ | ✅ | ❌ | ❌ |
| Not equal to | ✅ | ❌ | ❌ | ❌ |
Is nil |
✅ | ❌ | ❌ | ❌ |
| Type is | ✅ | ✅ | ❌ | ❌ |
| Length is | ✅ | ❌ | ❌ | ❌ |
| Slice elements in any order | ✅ | ❌ | ❌ | ❌ |
| Custom matcher | ✅ | ✅ | ❌ | ❌ |
func TestGomock(t *testing.T) {
ctrl := gomock.NewController(t)
m := NewMockMyInterface(ctrl)
gomock.InOrder(
m.EXPECT().Method(gomock.Any(), "abc").Return(123, nil),
m.EXPECT().AnotherMethod(gomock.Any(), gomock.Len(3)),
)
...
}func TestTestifyMock(t *testing.T) {
m := mocks.NewMyInterface(t)
m.EXPECT().Method(mock.Anything, "abc").After(5*time.Second).Return(123, nil).Once()
m.EXPECT().AnotherMethod(mock.Anything, "abc").Return(0, nil).Once()
...
}func TestMinimock(t *testing.T) {
ctrl := minimock.NewController(t)
t.Cleanup(ctrl.Finish)
m := NewMyInterfaceMock(ctrl)
m.MethodMock.When(context.Background(), "abc").Then(123, nil)
m.AnotherMethodMock.When(context.Background(), "abc").Then(0, nil)
...
}func TestMoq(t *testing.T) {
m := MyInterfaceMock{
MethodFunc: func(ctx context.Context, s string) (int, error) {
assert.Equal(t, "abc", s)
return 123, nil
},
AnotherMethodFunc: func(ctx context.Context, s string) (int, error) {
assert.Len(t, s, 1)
return 0, nil
},
}
t.Cleanup(func() {
assert.Len(t, m.MethodCalls(), 1)
assert.Len(t, m.AnotherMethodCalls(), 1)
})
...
}Footnotes
-
CLI tool to auto generate mocks from interfaces ↩
-
Allow writing mock manually, without code generation ↩
-
Mock constructor uses
t.Cleanup()to assert expectations after test by default ↩ -
Use arbitrary function to execute, allowing to implement any feature in the table ↩
-
Defining expected arguments in test doesn't rely on empty
interface{}↩ -
Defining returned values in test doesn't rely on empty
interface{}↩ -
Define expected order of calls ↩
-
Block execution of method using
time.Sleep()↩ -
Block execution of method using
<- channel↩ -
Panic instead of method execution ↩
-
Not defining return values leads to returning zero values ↩
-
Define expected exact number of calls in test ↩
-
Define expected min/max number of calls in test ↩
-
Not defining number of calls leads to expectation that method to be called once ↩