├── .gitignore ├── entity └── category.go ├── go.mod ├── go.sum ├── helper ├── hello_world.go └── hello_world_test.go ├── repository ├── category_repository.go └── category_repository_mock.go └── service ├── category_service.go └── category_service_test.go /.gitignore: -------------------------------------------------------------------------------- 1 | .idea -------------------------------------------------------------------------------- /entity/category.go: -------------------------------------------------------------------------------- 1 | package entity 2 | 3 | type Category struct { 4 | Id string 5 | Name string 6 | } 7 | -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module belajar-golang-unit-test 2 | 3 | go 1.15 4 | 5 | require github.com/stretchr/testify v1.6.1 6 | -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= 2 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 3 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= 4 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 5 | github.com/stretchr/objx v0.1.0 h1:4G4v2dO3VZwixGIRoQ5Lfboy6nUhCyYzaqnIAPPhYs4= 6 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 7 | github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= 8 | github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 9 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 10 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= 11 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 12 | -------------------------------------------------------------------------------- /helper/hello_world.go: -------------------------------------------------------------------------------- 1 | package helper 2 | 3 | func HelloWorld(name string) string { 4 | return "Hello " + name 5 | } 6 | -------------------------------------------------------------------------------- /helper/hello_world_test.go: -------------------------------------------------------------------------------- 1 | package helper 2 | 3 | import ( 4 | "fmt" 5 | "github.com/stretchr/testify/assert" 6 | "github.com/stretchr/testify/require" 7 | "runtime" 8 | "testing" 9 | ) 10 | 11 | func BenchmarkTable(b *testing.B) { 12 | benchmarks := []struct { 13 | name string 14 | request string 15 | }{ 16 | { 17 | name: "Eko", 18 | request: "Eko", 19 | }, 20 | { 21 | name: "Kurniawan", 22 | request: "Kurniawan", 23 | }, 24 | { 25 | name: "EkoKurniawanKhannedy", 26 | request: "Eko Kurniawan Khannedy", 27 | }, 28 | { 29 | name: "Budi", 30 | request: "Budi Nugraha", 31 | }, 32 | } 33 | 34 | for _, benchmark := range benchmarks { 35 | b.Run(benchmark.name, func(b *testing.B) { 36 | for i := 0; i < b.N; i++ { 37 | HelloWorld(benchmark.request) 38 | } 39 | }) 40 | } 41 | } 42 | 43 | func BenchmarkSub(b *testing.B) { 44 | b.Run("Eko", func(b *testing.B) { 45 | for i := 0; i < b.N; i++ { 46 | HelloWorld("Eko") 47 | } 48 | }) 49 | b.Run("Kurniawan", func(b *testing.B) { 50 | for i := 0; i < b.N; i++ { 51 | HelloWorld("Kurniawan") 52 | } 53 | }) 54 | } 55 | 56 | func BenchmarkHelloWorld(b *testing.B) { 57 | for i := 0; i < b.N; i++ { 58 | HelloWorld("Eko") 59 | } 60 | } 61 | 62 | func BenchmarkHelloWorldKurniawan(b *testing.B) { 63 | for i := 0; i < b.N; i++ { 64 | HelloWorld("Kurniawan") 65 | } 66 | } 67 | 68 | func TestTableHelloWorld(t *testing.T) { 69 | tests := []struct { 70 | name string 71 | request string 72 | expected string 73 | }{ 74 | { 75 | name: "Eko", 76 | request: "Eko", 77 | expected: "Hello Eko", 78 | }, 79 | { 80 | name: "Kurniawan", 81 | request: "Kurniawan", 82 | expected: "Hello Kurniawan", 83 | }, 84 | { 85 | name: "Khannedy", 86 | request: "Khannedy", 87 | expected: "Hello Khannedy", 88 | }, 89 | { 90 | name: "Budi", 91 | request: "Budi", 92 | expected: "Hello Budi", 93 | }, 94 | { 95 | name: "Joko", 96 | request: "Joko", 97 | expected: "Hello Joko", 98 | }, 99 | } 100 | 101 | for _, test := range tests { 102 | t.Run(test.name, func(t *testing.T) { 103 | result := HelloWorld(test.request) 104 | require.Equal(t, test.expected, result) 105 | }) 106 | } 107 | } 108 | 109 | func TestSubTest(t *testing.T) { 110 | t.Run("Eko", func(t *testing.T) { 111 | result := HelloWorld("Eko") 112 | require.Equal(t, "Hello Eko", result, "Result must be 'Hello Eko'") 113 | }) 114 | t.Run("Kurniawan", func(t *testing.T) { 115 | result := HelloWorld("Kurniawan") 116 | require.Equal(t, "Hello Kurniawan", result, "Result must be 'Hello Kurniawan'") 117 | }) 118 | t.Run("Khannedy", func(t *testing.T) { 119 | result := HelloWorld("Khannedy") 120 | require.Equal(t, "Hello Khannedy", result, "Result must be 'Hello Khannedy'") 121 | }) 122 | } 123 | 124 | func TestMain(m *testing.M) { 125 | // before 126 | fmt.Println("BEFORE UNIT TEST") 127 | 128 | m.Run() 129 | 130 | // after 131 | fmt.Println("AFTER UNIT TEST") 132 | } 133 | 134 | func TestSkip(t *testing.T) { 135 | if runtime.GOOS == "darwin" { 136 | t.Skip("Can not run on Mac OS") 137 | } 138 | 139 | result := HelloWorld("Eko") 140 | require.Equal(t, "Hello Eko", result, "Result must be 'Hello Eko'") 141 | } 142 | 143 | func TestHelloWorldRequire(t *testing.T) { 144 | result := HelloWorld("Eko") 145 | require.Equal(t, "Hello Eko", result, "Result must be 'Hello Eko'") 146 | fmt.Println("TestHelloWorld with Require Done") 147 | } 148 | 149 | func TestHelloWorldAssert(t *testing.T) { 150 | result := HelloWorld("Eko") 151 | assert.Equal(t, "Hello Eko", result, "Result must be 'Hello Eko'") 152 | fmt.Println("TestHelloWorld with Assert Done") 153 | } 154 | 155 | func TestHelloWorldEko(t *testing.T) { 156 | result := HelloWorld("Eko") 157 | 158 | if result != "Hello Eko" { 159 | // error 160 | t.Error("Result must be 'Hello Eko'") 161 | } 162 | 163 | fmt.Println("TestHelloWorldEko Done") 164 | } 165 | 166 | func TestHelloWorldKhannedy(t *testing.T) { 167 | result := HelloWorld("Khannedy") 168 | 169 | if result != "Hello Khannedy" { 170 | // error 171 | t.Fatal("Result must be 'Hello Khannedy'") 172 | } 173 | 174 | fmt.Println("TestHelloWorldKhannedy Done") 175 | } 176 | 177 | func TestHelloWorldKurniawan(t *testing.T) { 178 | result := HelloWorld("Kurniawan") 179 | 180 | if result != "Hello Kurniawan" { 181 | // error 182 | t.Fatal("Result must be 'Hello Kurniawan'") 183 | } 184 | 185 | fmt.Println("TestHelloWorldKurniawan Done") 186 | } 187 | -------------------------------------------------------------------------------- /repository/category_repository.go: -------------------------------------------------------------------------------- 1 | package repository 2 | 3 | import "belajar-golang-unit-test/entity" 4 | 5 | type CategoryRepository interface { 6 | FindById(id string) *entity.Category 7 | } 8 | -------------------------------------------------------------------------------- /repository/category_repository_mock.go: -------------------------------------------------------------------------------- 1 | package repository 2 | 3 | import ( 4 | "belajar-golang-unit-test/entity" 5 | "github.com/stretchr/testify/mock" 6 | ) 7 | 8 | type CategoryRepositoryMock struct { 9 | Mock mock.Mock 10 | } 11 | 12 | func (repository *CategoryRepositoryMock) FindById(id string) *entity.Category { 13 | arguments := repository.Mock.Called(id) 14 | if arguments.Get(0) == nil { 15 | return nil 16 | } else { 17 | category := arguments.Get(0).(entity.Category) 18 | return &category 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /service/category_service.go: -------------------------------------------------------------------------------- 1 | package service 2 | 3 | import ( 4 | "belajar-golang-unit-test/entity" 5 | "belajar-golang-unit-test/repository" 6 | "errors" 7 | ) 8 | 9 | type CategoryService struct { 10 | Repository repository.CategoryRepository 11 | } 12 | 13 | func (service CategoryService) Get(id string) (*entity.Category, error) { 14 | category := service.Repository.FindById(id) 15 | if category == nil { 16 | return nil, errors.New("Category Not Found") 17 | } else { 18 | return category, nil 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /service/category_service_test.go: -------------------------------------------------------------------------------- 1 | package service 2 | 3 | import ( 4 | "belajar-golang-unit-test/entity" 5 | "belajar-golang-unit-test/repository" 6 | "github.com/stretchr/testify/assert" 7 | "github.com/stretchr/testify/mock" 8 | "testing" 9 | ) 10 | 11 | var categoryRepository = &repository.CategoryRepositoryMock{Mock: mock.Mock{}} 12 | var categoryService = CategoryService{Repository: categoryRepository} 13 | 14 | func TestCategoryService_GetNotFound(t *testing.T) { 15 | 16 | // program mock 17 | categoryRepository.Mock.On("FindById", "1").Return(nil) 18 | 19 | category, err := categoryService.Get("1") 20 | assert.Nil(t, category) 21 | assert.NotNil(t, err) 22 | 23 | } 24 | 25 | func TestCategoryService_GetSuccess(t *testing.T) { 26 | category := entity.Category{ 27 | Id: "1", 28 | Name: "Laptop", 29 | } 30 | categoryRepository.Mock.On("FindById", "2").Return(category) 31 | 32 | result, err := categoryService.Get("2") 33 | assert.Nil(t, err) 34 | assert.NotNil(t, result) 35 | assert.Equal(t, category.Id, result.Id) 36 | assert.Equal(t, category.Name, result.Name) 37 | } --------------------------------------------------------------------------------