Как говорили другие, это внутренняя деталь, которая действительно связывает ваше тестирование с реализацией. Это ничего не значит, если вы определили, что порядок имеет значение. Краткое описание - еще одно решение, использующее минимум для порядка тестирования.
Создайте двух шпионов, реализующих InterfaceA и InterfaceB.
type SpyA struct {
Calls *[]string
}
func (s *SpyA) Execute() {
*s.Calls = append(*s.Calls, "ExecuteA")
}
type SpyB struct {
Calls *[]string
}
func (s *SpyB) Execute() {
*s.Calls = append(*s.Calls, "ExecuteB")
}
Затем используйте их вот так.
func TestApply(t *testing.T) {
got := []string{}
c := &Composition{
a: &SpyA{&got},
b: &SpyB{&got},
}
c.Apply()
expected := []string{"ExecuteA", "ExecuteB"}
if len(got) != len(expected) {
t.Fail()
}
for i := range got {
if got[i] != expected[i] {
t.Fail()
}
}
}
Детская площадка