Обновление, июнь 2023 года . Этот репо и инструмент больше не поддерживается. Пожалуйста, смотрите go.uber.org/mock для обслуживающей вилки.
Gomock - смешная структура для языка программирования GO. Он хорошо интегрируется со встроенным пакетом testing
GO, но может использоваться и в других контекстах.
После того, как вы установили GO, установите инструмент mockgen
.
ПРИМЕЧАНИЕ . Если вы уже не сделали этого, обязательно добавьте $GOPATH/bin
на свой PATH
.
Чтобы получить последнее выпущенное использование версии:
GO111MODULE=on go get github.com/golang/mock/[email protected]
go install github.com/golang/mock/[email protected]
Если вы используете mockgen
в вашем конвейере CI, может быть более подходящим для фиксации на определенной версии Mockgen. Вы должны попытаться сохранить библиотеку в синхронизации с версией Mockgen, используемой для генерации ваших макетов.
mockgen
имеет два режима работы: источник и размышлять.
Источник режима генерирует макет интерфейсы из исходного файла. Это включено с помощью флага -сюра. Другие флаги, которые могут быть полезны в этом режиме, -это -импорты и -aux_files.
Пример:
mockgen -source=foo.go [other options]
Режим отражения генерирует фиктивные интерфейсы, создавая программу, которая использует отражение для понимания интерфейсов. Он включен путем передачи двух не флагских аргументов: пути импорта и разделенный запятой список символов.
Вы можете использовать "." Чтобы ссылаться на пакет текущего пути.
Пример:
mockgen database/sql/driver Conn,Driver
# Convenient for `go:generate`.
mockgen . Conn,Driver
Команда mockgen
используется для генерации исходного кода для макетного класса с учетом исходного файла GO, содержащего интерфейсы, которые должны быть высмеиваются. Он поддерживает следующие флаги:
-source
: файл, содержащий интерфейсы, которые должны быть высмеивают.
-destination
: файл, на который можно написать полученный исходный код. Если вы не установите это, код печатается на стандартный вывод.
-package
: пакет, который можно использовать для полученного исходного кода макета класса. Если вы не установите это, имя пакета mock_
объединяется с пакетом входного файла.
-imports
: Список явных импортов, который следует использовать в полученном исходном коде, указанный как разделенный запятой список элементов формы foo=bar/baz
, где bar/baz
-это пакет, а foo
-это идентификатор использовать для пакета в сгенерированном исходном коде.
-aux_files
: Список дополнительных файлов, с которыми следует проконсультироваться для разрешения, например, встроенных интерфейсов, определенных в другом файле. Это указано как разделенный запятой список элементов формы foo=bar/baz.go
, где bar/baz.go
-это исходный файл, а foo
-это имя пакета этого файла, используемого файлом -Source.
-build_flags
: (только режим режима) Флаги проходили дословно, чтобы go build
.
-mock_names
: список пользовательских имен для сгенерированных макетов. Это указано как разделенный запятой список элементов Repository=MockSensorRepository,Endpoint=MockSensorEndpoint
, где Repository
является названием интерфейса, а MockSensorRepository
-желаемое макет (Mock Factory Method и Mock Record будет назван после макета). Если у одного из интерфейсов не указано пользовательское имя, то будет использоваться соглашение о именовании по умолчанию.
-self_package
: полный путь импорта пакета для сгенерированного кода. Цель этого флага - предотвратить циклы импорта в сгенерированном коде, пытаясь включить свой собственный пакет. Это может произойти, если пакет Mock установлен на один из его входов (обычно основной), а вывод - это stdio, поэтому Mockgen не может обнаружить окончательный выходной пакет. Установка этого флага сообщит Мокгену, какой импорт исключает.
-copyright_file
: Файл авторского права, используемый для добавления заголовка авторского права в полученный исходный код.
-debug_parser
: распечатать только результаты анализатора.
-exec_only
: (режим отражения) Если установлен, выполните эту программу отражения.
-prog_only
: (режим отражения) только генерируйте программу отражения; Напишите это в stdout и выйдите.
-write_package_comment
: записывает документацию пакета комментарий (Годок), если это правда. (по умолчанию правда)
Для примера использования mockgen
см. sample/
каталог. В простых случаях вам понадобится только флаг -source
.
type Foo interface {
Bar ( x int ) int
}
func SUT ( f Foo ) {
// ...
}
func TestFoo ( t * testing. T ) {
ctrl := gomock . NewController ( t )
// Assert that Bar() is invoked.
defer ctrl . Finish ()
m := NewMockFoo ( ctrl )
// Asserts that the first and only call to Bar() is passed 99.
// Anything else will fail.
m .
EXPECT ().
Bar ( gomock . Eq ( 99 )).
Return ( 101 )
SUT ( m )
}
Если вы используете версию GO 1.14+, Mockgen версию 1.5.0+, и передаете *testing.t в gomock.NewController(t)
вам больше не нужно вызовать ctrl.Finish()
явно. Это будет вызвано для вас автоматически из функции очистки, зарегистрированной на самореализации.
type Foo interface {
Bar ( x int ) int
}
func SUT ( f Foo ) {
// ...
}
func TestFoo ( t * testing. T ) {
ctrl := gomock . NewController ( t )
defer ctrl . Finish ()
m := NewMockFoo ( ctrl )
// Does not make any assertions. Executes the anonymous functions and returns
// its result when Bar is invoked with 99.
m .
EXPECT ().
Bar ( gomock . Eq ( 99 )).
DoAndReturn ( func ( _ int ) int {
time . Sleep ( 1 * time . Second )
return 101
}).
AnyTimes ()
// Does not make any assertions. Returns 103 when Bar is invoked with 101.
m .
EXPECT ().
Bar ( gomock . Eq ( 101 )).
Return ( 103 ).
AnyTimes ()
SUT ( m )
}
Когда матлер сообщает об отказе, он печатает полученное ( Got
) против ожидаемого ( Want
) значения.
Got: [3]
Want: is equal to 2
Expected call at user_test.go:33 doesn ' t match the argument at index 1.
Got: [0 1 1 2 3]
Want: is equal to 1
Want
Значение Want
происходит из метода Matchter's String()
. Если выход по умолчанию не соответствует вашим потребностям, то его можно изменить следующим образом:
gomock . WantFormatter (
gomock . StringerFunc ( func () string { return "is equal to fifteen" }),
gomock . Eq ( 15 ),
)
Это изменяет вывод совместного маттера gomock.Eq(15)
для Want:
от is equal to 15
до 15 is equal to fifteen
.
Got
Значение Got
поступает из метода String()
объекта (), если он доступен. В некоторых случаях вывод объекта трудно читать (например, []byte
), и для теста было бы полезно печатать его по -разному. Следующее изменяет, как отформатировано Got
значение:
gomock . GotFormatterAdapter (
gomock . GotFormatterFunc ( func ( i interface {}) string {
// Leading 0s
return fmt . Sprintf ( "%02d" , i )
}),
gomock . Eq ( 15 ),
)
Если полученное значение составляет 3
, то оно будет напечатано как 03
.
cannot find package "."
... github.com/golang/mock/mockgen/model
Если вы столкнетесь с этой ошибкой при использовании режима режима и зависимостей с поставщиком, вы можете выбрать три обходного пути:
import _ "github.com/golang/mock/mockgen/model"
.--build_flags=--mod=mod
в вашу команду Mockgen. Эта ошибка связана с изменениями в поведении команды по go
в более поздних версиях. Более подробную информацию можно найти в #494.