30 Oct 2022
·
3 mnt baca
·Artikel 21 / 119
GoCara Membuat Unit Test Menggunakan Library Moq Pada Golang
IH
Ihsan Arif
Penulis di Santekno · Backend Engineer
Melakukan unit test dengan cara mocking ini biasanya digunakan jika sudah beberapa fungsi yang dilakukan dengan format interface sehingga kita bisa asumsikan jika memanggil fungsi interface tersebut kita meyakini bahwa harus menghasilkan program yang benar.
Saat ini untuk membuat mocking kita menggunakan library dari github.com/matryer/moq . Jika belum ada library tersebut kita bisa download terlebih dahulu dengan perintah dibawah ini.
1$ go install github.com/matryer/moq@latestBerikut kita akan coba membuat suatu project yang memiliki fungsi interface dibawah ini.
1package main
2
3import "fmt"
4
5type User struct {
6 Username string `json:"username"`
7 Password string `json:"password"`
8}
9
10//go:generate moq -out main_mock_test.go . UserRepositoryInterface
11type UserRepositoryInterface interface {
12 GetAllUsers() ([]User, error)
13}
14
15type UserService struct {
16 UserRepositoryInterface
17}
18
19func (s UserService) GetUser() ([]User, error) {
20 users, _ := s.UserRepositoryInterface.GetAllUsers()
21 for i := range users {
22 users[i].Password = "*****"
23 }
24 return users, nil
25}
26
27type UserRepository struct{}
28
29func (r UserRepository) GetAllUsers() ([]User, error) {
30 users := []User{
31 {"real", "real"},
32 {"real2", "real2"},
33 }
34 return users, nil
35}
36
37func main() {
38 repository := UserRepository{}
39 service := UserService{repository}
40 users, _ := service.GetUser()
41 fmt.Println(users)
42}Lalu lanjut dengan cara membuat unit test bisa dilihat dibawah ini
1package main
2
3import (
4 "fmt"
5 "reflect"
6 "testing"
7
8 "github.com/stretchr/testify/assert"
9 "github.com/stretchr/testify/mock"
10)
11
12type UserRepositoryMock struct {
13 mock.Mock
14}
15
16func (r UserRepositoryMock) GetAllUsers() ([]User, error) {
17 args := r.Called()
18 users := []User{
19 {"mock", "*****"},
20 }
21 return users, args.Error(1)
22}
23
24func TestService_GetUser(t *testing.T) {
25 repository := UserRepositoryMock{}
26 repository.On("GetAllUsers").Return([]User{}, nil)
27
28 service := UserService{repository}
29 users, _ := service.GetUser()
30 for i := range users {
31 assert.Equal(t, users[i].Password, "*****", "user password must be encrypted")
32 }
33 fmt.Println(users)
34}
35
36func TestUserService_GetUser(t *testing.T) {
37 type fields struct {
38 UserRepositoryInterface UserRepositoryInterface
39 }
40 tests := []struct {
41 name string
42 fields fields
43 want []User
44 wantErr bool
45 }{
46 {
47 name: "case ambil data user",
48 fields: fields{
49 UserRepositoryInterface: UserRepositoryMock{},
50 },
51 },
52 }
53 for _, tt := range tests {
54 t.Run(tt.name, func(t *testing.T) {
55 s := UserService{
56 UserRepositoryInterface: tt.fields.UserRepositoryInterface,
57 }
58 got, err := s.GetUser()
59 if (err != nil) != tt.wantErr {
60 t.Errorf("UserService.GetUser() error = %v, wantErr %v", err, tt.wantErr)
61 return
62 }
63 if !reflect.DeepEqual(got, tt.want) {
64 t.Errorf("UserService.GetUser() = %v, want %v", got, tt.want)
65 }
66 })
67 }
68}Artikel Terkait
Go
20 Jul 2026
CLAUDE.md: Cara Membuat AI Selalu Paham Konteks Proyek Golang
18 mnt
Baca
Go
16 Jul 2026
Ekosistem Tools SDD 2026: Claude Code, Kiro, Cursor vs Spec Kit untuk Golang
20 mnt
Baca
Go
15 Jul 2026
Spesifikasi sebagai Source of Truth di Golang: Cara Berpikir SDD yang Baru
21 mnt
Baca
Go
13 Jul 2026
Vibe Coding vs Specification-Driven Development: Kenapa Engineer Senior Mulai Pindah
23 mnt
Baca