Skip to content
Santekno.com | Level Up Your Engineering Skills
ID
📖 0%
30 Oct 2022 · 3 mnt baca ·Artikel 21 / 119
Go

Cara 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.

bash
1$ go install github.com/matryer/moq@latest

Berikut kita akan coba membuat suatu project yang memiliki fungsi interface dibawah ini.

go
 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

go
 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

💬 Komentar