Atualização, junho de 2023 : Este repositório e ferramenta não são mais mantidos. Por favor, consulte go.uber.org/mock para obter um garfo mantido.
Gomock é uma estrutura zombeteira da linguagem de programação GO. Ele se integra bem ao pacote testing
interno do Go, mas também pode ser usado em outros contextos.
Depois de instalar o Go, instale a ferramenta mockgen
.
NOTA : Se você ainda não o fez, adicione $GOPATH/bin
ao seu PATH
.
Para obter o último uso da versão lançada:
GO111MODULE=on go get github.com/golang/mock/[email protected]
go install github.com/golang/mock/[email protected]
Se você usar mockgen
em seu pipeline de IC, pode ser mais apropriado fixar em uma versão específica de mockgen. Você deve tentar manter a biblioteca sincronizada com a versão do Mockgen usada para gerar suas zombarias.
mockgen
possui dois modos de operação: fonte e refletir.
O modo de origem gera interfaces simuladas a partir de um arquivo de origem. Ele está ativado usando o sinalizador -Erce. Outros sinalizadores que podem ser úteis nesse modo são -imports e -aux_files.
Exemplo:
mockgen -source=foo.go [other options]
O modo de reflexão gera interfaces simuladas criando um programa que usa a reflexão para entender as interfaces. É ativado pela passagem de dois argumentos não-flag: um caminho de importação e uma lista de símbolos separados por vírgula.
Você pode usar "." Para se referir ao pacote do caminho atual.
Exemplo:
mockgen database/sql/driver Conn,Driver
# Convenient for `go:generate`.
mockgen . Conn,Driver
O comando mockgen
é usado para gerar código -fonte para uma classe simulada, dado um arquivo de origem Go contendo interfaces a serem ridicularizadas. Ele suporta as seguintes bandeiras:
-source
: um arquivo que contém interfaces a serem ridicularizados.
-destination
: um arquivo para gravar o código -fonte resultante. Se você não definir isso, o código será impresso na saída padrão.
-package
: o pacote a ser usado para o código -fonte da classe simulada resultante. Se você não definir isso, o nome do pacote será mock_
concatenado com o pacote do arquivo de entrada.
-imports
: Uma lista de importações explícitas que devem ser usadas no código-fonte resultante, especificado como uma lista separada por vírgula de elementos do formulário foo=bar/baz
, onde bar/baz
é o pacote que está sendo importado e foo
é o identificador Para usar para o pacote no código -fonte gerado.
-aux_files
: Uma lista de arquivos adicionais que devem ser consultados para resolver as interfaces incorporadas, por exemplo, definidas em um arquivo diferente. Isso é especificado como uma lista separada por vírgula de elementos do formulário foo=bar/baz.go
, onde bar/baz.go
é o arquivo de origem e foo
é o nome do pacote desse arquivo usado pelo arquivo -Source.
-build_flags
: (somente o modo de refletir) sinalizadores passados literalmente para go build
.
-mock_names
: Uma lista de nomes personalizados para zombarias geradas. Isso é especificado como uma lista separada por vírgula de elementos do Repository=MockSensorRepository,Endpoint=MockSensorEndpoint
, onde Repository
é o nome da interface e MockSensorRepository
é o nome simulado desejado (o método de fábrica simulado e o gravador simulado terão o nome do simulado). Se uma das interfaces não tiver um nome personalizado especificado, a Convenção de Nomeação Padrão será usada.
-self_package
: o caminho de importação completo para o código gerado. O objetivo deste sinalizador é evitar ciclos de importação no código gerado, tentando incluir seu próprio pacote. Isso pode acontecer se o pacote do Mock for definido como uma de suas entradas (geralmente a principal) e a saída é o stdio, para que o MockGen não possa detectar o pacote de saída final. Definir este sinalizador informará o MockGen qual importação exclui.
-copyright_file
: arquivo de direitos autorais usado para adicionar o cabeçalho de direitos autorais ao código -fonte resultante.
-debug_parser
: Imprima apenas os resultados do analisador.
-exec_only
: (modo de refletir) Se definido, execute este programa de reflexão.
-prog_only
: (Modo de refletir) Gere apenas o programa de reflexão; Escreva para Stdout e saia.
-write_package_comment
: grava o comentário da documentação do pacote (GODOC) se verdadeiro. (padrão true)
Para um exemplo do uso do mockgen
, consulte o sample/
diretório. Em casos simples, você precisará apenas da bandeira -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 )
}
Se você estiver usando uma versão GO do 1.14+, uma versão simulada do 1.5.0+ e estiver passando um *testing.t para gomock.NewController(t)
não precisará mais ligar de ctrl.Finish()
explicitamente. Ele será chamado para você automaticamente de uma função de limpeza auto -registrada.
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 )
}
Quando um Matcher relata uma falha, ele imprime o valor recebido ( Got
) versus o valor esperado ( 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
O valor Want
vem do método String()
do Matcher (). Se a saída padrão do Matcher não atender às suas necessidades, poderá ser modificado da seguinte maneira:
gomock . WantFormatter (
gomock . StringerFunc ( func () string { return "is equal to fifteen" }),
gomock . Eq ( 15 ),
)
Isso modifica a saída gomock.Eq(15)
Matchaer para Want:
de is equal to 15
a is equal to fifteen
.
Got
O valor Got
vem do método String()
do objeto, se estiver disponível. Em alguns casos, é difícil ler a saída de um objeto (por exemplo, []byte
) e seria útil para o teste imprimi -lo de maneira diferente. O seguinte modifica como o valor Got
é formatado:
gomock . GotFormatterAdapter (
gomock . GotFormatterFunc ( func ( i interface {}) string {
// Leading 0s
return fmt . Sprintf ( "%02d" , i )
}),
gomock . Eq ( 15 ),
)
Se o valor recebido for 3
, será impresso como 03
.
cannot find package "."
... github.com/golang/mock/mockgen/model
Se você se deparar com esse erro ao usar o modo de refletir e vender dependências, existem três soluções alternativas que você pode escolher:
import _ "github.com/golang/mock/mockgen/model"
.--build_flags=--mod=mod
ao seu comando zombegen. Esse erro se deve a alterações no comportamento padrão do comando go
em versões mais recentes. Mais detalhes podem ser encontrados no #494.