How would I streamline the following testing scenario in Go?
Say I have some interface I with a corresponding implementation A and most of my tests for A basically look like:
func TestSomething(t *testing.T) {
instances := setupI(5)
// actual testing code...
}
func setupI(n: int) []I {
instances := make([]I, n)
for i := 0; i < n; i++ {
instances[i] = A { ... } // concrete implementation A used here
}
return instances
}
Some other tests are specific to the details hidden behind the interface I, so tests like the following are used instead:
func TestSomethingForA(t *testing.T) {
instance := A { ... }
// actual testing code...
}
Say now I have two more implementation for I named B and C.
How do I also test B and C with all the tests of the first kind? Of course a simple way would be to copy the common testcode two more times, and, for example, add a parameter to setupI(...) to initialize instances with the different implementations. However, I would like to avoid copying the code and having to keep three different places in sync down the road. Any better ideas?