gomock Go: इंटरफेस मॉकिंग की पूरी गाइड
1. यह क्या है और क्यों ज़रूरी है?
आधुनिक Go डेवलपमेंट में टेस्टिंग की अहम भूमिका है। लेकिन अक्सर कोड बाहरी सिस्टम पर निर्भर करता है: डेटाबेस, HTTP-क्लाइंट, फ़ाइल सिस्टम या दूसरे माइक्रोसर्विसेज़। ऐसे कोड को अलग-थलग टेस्ट करना मुश्किल है क्योंकि इन डिपेंडेंसीज़ को असली वातावरण चाहिए। यहाँ gomock काम आता है — Go इंटरफेस के लिए मॉक (नकली इम्प्लीमेंटेशन) बनाने और उपयोग करने की एक शक्तिशाली लाइब्रेरी।
gomock अपने आप इंटरफेस के ऐसे इम्प्लीमेंटेशन बनाता है जो पूर्वानुमानित व्यवहार करते हैं: तय वैल्यू लौटाते हैं, कॉल के क्रम की जाँच करते हैं, कॉल की संख्या गिनते हैं और एरर भी सिम्युलेट करते हैं। इससे यूनिट टेस्ट तेज़, निश्चित और बाहरी संसाधनों से स्वतंत्र हो जाते हैं। यह लाइब्रेरी Go के बिल्ट-इन testing पैकेज के साथ गहराई से जुड़ती है और Go समुदाय में मॉकिंग का डी-फैक्टो स्टैंडर्ड है।
gomock की मुख्य खासियत यह है कि आप अपने कोड के व्यवहार का टेस्ट करते हैं, न कि उसके इम्प्लीमेंटेशन का। आप जाँचते हैं कि आपका सर्विस सही आर्गुमेंट्स के साथ डिपेंडेंसी के मेथड्स को कॉल कर रहा है और रिजल्ट्स को सही तरीके से हैंडल कर रहा है। यह SOLID सिद्धांतों और Dependency Injection पैटर्न का पालन करने पर खासतौर पर महत्वपूर्ण है।
2. इंस्टॉलेशन
gomock के साथ काम करने के लिए दो कम्पोनेंट्स इंस्टॉल करने होंगे:
- gomock लाइब्रेरी — मॉक के साथ काम करने का रनटाइम प्रदान करती है।
- mockgen टूल — इंटरफेस से मॉक कोड जनरेट करता है।
इंस्टॉलेशन Go के स्टैंडर्ड पैकेज मैनेजर से होता है:
# लाइब्रेरी इंस्टॉल करें
go get github.com/golang/mock/gomock
# mockgen टूल इंस्टॉल करें
go install github.com/golang/mock/mockgen@v1.6.0
इंस्टॉल करने के बाद जाँचें कि mockgen आपके PATH में उपलब्ध है:
mockgen --version
अगर आप Go 1.16+ का उपयोग कर रहे हैं, तो वर्जन कंट्रोल के लिए mockgen को tools.go में जोड़ना अच्छा रहेगा:
// tools.go
// +build tools
package tools
import (
_ "github.com/golang/mock/mockgen"
)
3. तुरंत शुरुआत — एक छोटा काम का उदाहरण
एक सरल उदाहरण देखते हैं। मान लीजिए हमारे पास Greeter इंटरफेस है, जिसे हम मॉक करना चाहते हैं।
// greeter.go
package main
// Greeter — वह इंटरफेस जिसे हम मॉक करेंगे
type Greeter interface {
Greet(name string) string
}
// Service Greeter का उपयोग करता है
type Service struct {
greeter Greeter
}
func NewService(g Greeter) *Service {
return &Service{greeter: g}
}
func (s *Service) SayHello(name string) string {
return s.greeter.Greet(name)
}
पहले मॉक जनरेट करें:
mockgen -source=greeter.go -destination=mock_greeter.go -package=main
अब टेस्ट लिखें:
// greeter_test.go
package main
import (
"testing"
"github.com/golang/mock/gomock"
)
func TestSayHello(t *testing.T) {
// gomock कंट्रोलर बनाएं
ctrl := gomock.NewController(t)
defer ctrl.Finish()
// Greeter का मॉक बनाएं
mockGreeter := NewMockGreeter(ctrl)
// उम्मीद सेट करें: Greet("Alice") कॉल करने पर "Hello, Alice!" लौटाए
mockGreeter.EXPECT().Greet("Alice").Return("Hello, Alice!")
// मॉक के साथ सर्विस बनाएं
service := NewService(mockGreeter)
// टेस्ट किए जाने वाले मेथड को कॉल करें
result := service.SayHello("Alice")
// रिजल्ट जाँचें
if result != "Hello, Alice!" {
t.Errorf("Expected 'Hello, Alice!', got '%s'", result)
}
}
टेस्ट चलाएँ:
go test -v
आप देखेंगे कि टेस्ट सफलतापूर्वक पास हो जाता है। मॉक ने अपने आप जाँच लिया कि