UPDATE, Juni 2023 : Repo dan alat ini tidak lagi dipertahankan. Silakan lihat go.uber.org/mock untuk garpu yang dipelihara sebagai gantinya.
Gomock adalah kerangka kerja mengejek untuk bahasa pemrograman GO. Ini terintegrasi dengan baik dengan paket testing
bawaan Go, tetapi dapat digunakan dalam konteks lain juga.
Setelah Anda menginstal GO, instal alat mockgen
.
Catatan : Jika Anda belum melakukannya, pastikan untuk menambahkan $GOPATH/bin
ke PATH
Anda.
Untuk mendapatkan versi terbaru yang dirilis, gunakan:
GO111MODULE=on go get github.com/golang/mock/[email protected]
go install github.com/golang/mock/[email protected]
Jika Anda menggunakan mockgen
di pipa CI Anda, mungkin lebih tepat untuk diperbaiki pada versi mockgen tertentu. Anda harus mencoba menjaga perpustakaan tetap sinkron dengan versi mockgen yang digunakan untuk menghasilkan ejekan Anda.
mockgen
memiliki dua mode operasi: sumber dan refleksi.
Mode sumber menghasilkan antarmuka tiruan dari file sumber. Diaktifkan dengan menggunakan bendera -source. Bendera lain yang mungkin berguna dalam mode ini adalah -Imports dan -acaux_files.
Contoh:
mockgen -source=foo.go [other options]
Reflect Mode menghasilkan antarmuka tiruan dengan membangun program yang menggunakan refleksi untuk memahami antarmuka. Ini diaktifkan dengan melewati dua argumen non-flag: jalur impor, dan daftar simbol yang dipisahkan koma.
Anda dapat menggunakan "." untuk merujuk ke paket jalur saat ini.
Contoh:
mockgen database/sql/driver Conn,Driver
# Convenient for `go:generate`.
mockgen . Conn,Driver
Perintah mockgen
digunakan untuk menghasilkan kode sumber untuk kelas tiruan yang diberikan file sumber GO yang berisi antarmuka untuk diejek. Ini mendukung bendera berikut:
-source
: File yang berisi antarmuka untuk diejek.
-destination
: File yang harus ditulis kode sumber yang dihasilkan. Jika Anda tidak mengatur ini, kode dicetak ke output standar.
-package
: Paket yang akan digunakan untuk kode sumber kelas tiruan yang dihasilkan. Jika Anda tidak mengatur ini, nama paket mock_
digabungkan dengan paket file input.
-imports
: Daftar impor eksplisit yang harus digunakan dalam kode sumber yang dihasilkan, ditentukan sebagai daftar elemen yang dipisahkan koma dari formulir foo=bar/baz
, di mana bar/baz
adalah paket yang diimpor dan foo
adalah pengidentifikasi untuk digunakan untuk paket dalam kode sumber yang dihasilkan.
-aux_files
: Daftar file tambahan yang harus dikonsultasikan untuk menyelesaikan Antarmuka tertanam misalnya yang ditentukan dalam file yang berbeda. Ini ditentukan sebagai daftar elemen yang dipisahkan koma dari formulir foo=bar/baz.go
, di mana bar/baz.go
adalah file sumber dan foo
adalah nama paket dari file yang digunakan oleh file sumber.
-build_flags
: (hanya memantulkan mode) Bendera lulus kata demi kata untuk go build
.
-mock_names
: Daftar nama khusus untuk tiruan yang dihasilkan. Ini ditentukan sebagai daftar elemen yang dipisahkan koma dari bentuk Repository=MockSensorRepository,Endpoint=MockSensorEndpoint
, di mana Repository
adalah nama antarmuka dan MockSensorRepository
adalah nama mock yang diinginkan (metode pabrik tiruan dan periksa mock akan dinamai setelah mock). Jika salah satu antarmuka tidak memiliki nama khusus yang ditentukan, maka konvensi penamaan default akan digunakan.
-self_package
: Paket Impor Paket Lengkap untuk kode yang dihasilkan. Tujuan bendera ini adalah untuk mencegah siklus impor dalam kode yang dihasilkan dengan mencoba memasukkan paketnya sendiri. Ini dapat terjadi jika paket tiruan diatur ke salah satu inputnya (biasanya yang utama) dan outputnya adalah STDIO sehingga MockGen tidak dapat mendeteksi paket output akhir. Mengatur bendera ini kemudian akan memberi tahu Mockgen mana yang akan dikecualikan.
-copyright_file
: File hak cipta yang digunakan untuk menambahkan header hak cipta ke kode sumber yang dihasilkan.
-debug_parser
: Cetak hasil parser saja.
-exec_only
: (Mode Refleksi) Jika diatur, jalankan program refleksi ini.
-prog_only
: (mode refleksi) Hanya menghasilkan program refleksi; Tuliskan ke stdout dan keluar.
-write_package_comment
: Menulis Komentar Dokumentasi Paket (GODOC) jika benar. (default true)
Untuk contoh penggunaan mockgen
, lihat sample/
direktori. Dalam kasus sederhana, Anda hanya perlu bendera -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 )
}
Jika Anda menggunakan versi GO 1.14+, versi mockgen 1.5.0+, dan melewati pengujian *ke gomock.NewController(t)
Anda tidak perlu lagi memanggil ctrl.Finish()
secara eksplisit. Ini akan dipanggil untuk Anda secara otomatis dari fungsi pembersihan yang terdaftar sendiri.
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 )
}
Ketika pencocokan melaporkan kegagalan, itu mencetak nilai yang diterima ( Got
) vs yang diharapkan ( 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
Nilai Want
berasal dari metode pencocokan String()
. Jika output default pencocokan tidak memenuhi kebutuhan Anda, maka itu dapat dimodifikasi sebagai berikut:
gomock . WantFormatter (
gomock . StringerFunc ( func () string { return "is equal to fifteen" }),
gomock . Eq ( 15 ),
)
Ini memodifikasi output pencocokan gomock.Eq(15)
untuk Want:
dari is equal to 15
hingga is equal to fifteen
.
Got
Nilai Got
berasal dari metode Object's String()
jika tersedia. Dalam beberapa kasus, output suatu objek sulit dibaca (misalnya, []byte
) dan akan sangat membantu tes untuk mencetaknya secara berbeda. Berikut ini memodifikasi bagaimana nilai Got
diformat:
gomock . GotFormatterAdapter (
gomock . GotFormatterFunc ( func ( i interface {}) string {
// Leading 0s
return fmt . Sprintf ( "%02d" , i )
}),
gomock . Eq ( 15 ),
)
Jika nilai yang diterima adalah 3
, maka itu akan dicetak sebagai 03
.
cannot find package "."
... github.com/golang/mock/mockgen/model
Jika Anda menemukan kesalahan ini saat menggunakan mode refleksi dan dependensi vendoring ada tiga solusi yang dapat Anda pilih:
import _ "github.com/golang/mock/mockgen/model"
.--build_flags=--mod=mod
ke perintah mockgen Anda. Kesalahan ini disebabkan oleh perubahan perilaku default dari perintah go
di versi yang lebih baru. Rincian lebih lanjut dapat ditemukan di #494.