Ich versuche, einen einfachen Schein für Unit-Test einige Code mit dem VMware vSphere-API-Client erstellen - govmomi - aber ich habe Probleme, ein brauchbares Muster zu finden.Schnittstelle in Golang für Mocking Third-Party-Bibliotheken
Ein einfaches Anwendungsfall für die Client-Bibliothek wäre die installierten Lizenzen für einen vSphere Cluster abzurufen:
vclient, err := govmomi.NewClient(*vcurl, true)
if err != nil {
return err
}
lic, err := vclient.LicenseManager().ListLicenses()
NewClient()
gibt einen Zeiger auf einer Client-Struktur, Client.LicenseManager()
eine Instanz einer License Struktur zurückgibt, und LicenseManager.ListLicenses()
gibt eine Teilstruktur mit den Lizenzinformationen zurück. Aus einem Python-Hintergrund stammend, würde ich normalerweise die ListLicenses()
Methode auf LicenseManger
für einen Schein affektieren, aber ich kann nicht scheinen, mit einem vergleichbaren Muster oder einer Methode in Go zu kommen.
Bis zu diesem Punkt habe ich versucht, mit Logik für Mocks eine Wrapper-Struktur VCenterClient
mit dem govmomi Client
Struktur als anonymes Mitglied und ein „Konstruktor“ Funktion Erstellen NewVCenter()
auf neue Instanzen der Wrapper-Struktur zu erstellen:
import (
"net/url"
"github.com/vmware/govmomi"
"github.com/vmware/govmomi/vim25/types"
)
type VCenterClient struct {
VCenterClientInterface
}
type VCenterClientInterface interface {
LicenseManager() LicenseManager
}
type LicenseManager interface {
ListLicenses() ([]types.LicenseManagerLicenseInfo, error)
}
type VCenterClientMock struct{}
type LicenseManagerMock struct{}
func (v *VCenterClientMock) LicenseManager() LicenseManager {
return LicenseManagerMock{}
}
func (l LicenseManagerMock) ListLicenses() ([]types.LicenseManagerLicenseInfo, error) {
return make([]types.LicenseManagerLicenseInfo, 0), nil
}
func NewVCenterClient(uri string, mock bool) *VCenterClient {
if mock {
return &VCenterClient{&VCenterClientMock{}}
}
vcurl, _ := url.Parse(uri)
vclient, _ := govmomi.NewClient(*vcurl, true)
return &VCenterClient{vclient}
}
... aber ich habe Probleme bei der Verwendung von Schnittstellen, um die verschachtelten Strukturen in der Govmomi-Bibliothek richtig zu abstrahieren. Ich weiß, das obige funktioniert nicht, da govmomi.LicenseManager()
eine Struktur vom Typ govmomi.LicenseManager
zurückgibt und meine Methode eine Schnittstelle vom Typ LicenseManager
zurückgibt. Ich kämpfe jedoch, um eine Alternative zu finden.
Jede Hilfe zu einem besseren Design-Muster oder ordnungsgemäße Verwendung von Schnittstellen in diesem Fall würde sehr geschätzt werden.