Я вижу три простых способа исправить это:
1- Измените сигнатуру метода Call, чтобы получить указатель на MockSimple, а при создании экземпляра простой структуры присвойте ему адрес вашего макета:
func (ms *MockSimple) Call() {
ms.hasBeenCalled = true
}
func TestMockCalled(t *testing.T) {
ms := MockSimple{}
s := Simple{
simpleInterface: &ms,
}
s.CallInterface()
if ms.hasBeenCalled != true {
t.Error("Interface has not been called")
}
}
2 - Не самое чистое решение, но все еще работает.Используйте его, если вы действительно не можете использовать # 1.Объявите «hasBeenCalled» где-то еще и измените ваш MockSimple, чтобы он содержал указатель на него:
type MockSimple struct {
hasBeenCalled *bool
}
func (ms MockSimple) Call() {
*ms.hasBeenCalled = true
}
func TestMockCalled(t *testing.T) {
hasBeenCalled := false
ms := MockSimple{&hasBeenCalled}
s := Simple{
simpleInterface: ms,
}
s.CallInterface()
if hasBeenCalled != true {
t.Error("Interface has not been called")
}
}
3 - возможно, действительно плохое решение : использование глобальных переменных, поэтому я бы использовал его только какв крайнем случае (всегда избегайте глобального состояния).Сделайте «hasBeenCalled» глобальным и измените его из метода.
var hasBeenCalled bool
type MockSimple struct{}
func (ms MockSimple) Call() {
hasBeenCalled = true
}
func TestMockCalled(t *testing.T) {
ms := MockSimple{}
s := Simple{
simpleInterface: ms,
}
s.CallInterface()
if hasBeenCalled != true {
t.Error("Interface has not been called")
}
}
Приветствия!