There are a few test cases I want to run for which there is a need to start a GRPC mock server. I am using gomock library for this. To start the server, I have to pass a variable of type testing.T to this function - gomock.NewController(). Since this is a kind of initialization for all the test cases, I want to do this in TestMain. But TestMain has access to only testing.M So how do I handle this case? Create a new testing.T structure in TestMain? Will it work?
Asked
Active
Viewed 3,194 times
4
Jonathan Hall
- 75,165
- 16
- 143
- 189
aniztar
- 2,443
- 4
- 18
- 24
-
1As TestReporter is only an interface, you may try to create yours: https://github.com/golang/mock/issues/122#issuecomment-338743825 – Berkant İpek Nov 03 '18 at 07:31
-
4You can't create a testing.T instance because all fields are not exported. Forget about TestMain and start the server in each test individually. That's best practice in general. – Peter Nov 03 '18 at 07:37
-
please provide some code example of your main function. I am sure you have too much things inside. With a little refactoring of your main function the testing will be then much easier. – apxp Nov 03 '18 at 10:10
1 Answers
5
It sounds like you are looking for a BeforeEach pattern. You don't have access to a testing.T object in TestMain because this is something more of a place to do initialization before and after the test suite runs.
There are a few frameworks out there that can give you a BeforeEach cheap:
to name a few.
You could also hand roll your own:
type test struct{
ctrl *gomock.Controller
mockFoo *MockFoo
// ...
}
func beforeEach(t *testing.T) test {
ctrl := gomock.NewController(t)
return test {
ctrl:ctrl,
mockFoo: NewMockFoo(ctrl),
}
}
func TestBar(t *testing.T) {
test := beforeEach(t)
// ...
}
func TestBaz(t *testing.T) {
test := beforeEach(t)
// ...
}
poy
- 10,063
- 9
- 49
- 74