💬Что из себя представляет стабы (stubs) и моки (mock) в контексте тестирования в Go?



📌Стабы (stubs) и моки (mocks) являются техниками, используемыми для изоляции тестируемого кода от внешних зависимостей во время тестирования в Go.



🔸Стабы (stubs) — это фейковые объекты, которые предоставляют предопределенные ответы на вызовы методов во время тестирования.



package main



import "fmt"




type DatabaseStub struct{}



func (db *DatabaseStub) GetUserName(id int) string {

return "Alice"

}



type Database interface {

GetUserName(id int) string

}



func PrintUserName(db Database, id int) {

name := db.GetUserName(id)

fmt.Println(name)

}



func main() {

dbStub := &DatabaseStub{}

PrintUserName(dbStub, 1)

}




🔸Моки (mocks) — это более продвинутые фейковые объекты, которые, кроме предоставления предопределенных ответов, также проверяют, как и когда методы были вызваны в тестах, что помогает в проверке взаимодействия между объектами.



package main



import (

"github.com/stretchr/testify/mock"

"testing"

)



type DatabaseMock struct {

mock.Mock

}



func (db *DatabaseMock) GetUserName(id int) string {

args := db.Called(id)

return args.String(0)

}



func TestPrintUserName(t *testing.T) {

dbMock := new(DatabaseMock)

dbMock.On("GetUserName", 1).Return("Alice")



name := dbMock.GetUserName(1)



dbMock.AssertExpectations(t)

}




📌В первом примере создается стаб DatabaseStub, который имеет метод GetUserName. Во втором примере создается мок DatabaseMock с использованием библиотеки testify, который проверяет, был ли метод GetUserName вызван с правильным аргументом.