2015-02-09 12 views
5

Sto provando a creare un semplice simulacro per l'unità test del codice utilizzando il client API VMware vSphere - govmomi - ma ho difficoltà a trovare uno schema utilizzabile.Uso di interfaccia in golang per deridere librerie di terze parti

Un caso semplice utilizzo per la libreria client sarebbe quello di recuperare le licenze installate per un cluster vSphere:

vclient, err := govmomi.NewClient(*vcurl, true) 
if err != nil { 
return err 
} 
lic, err := vclient.LicenseManager().ListLicenses() 

NewClient() restituisce un puntatore ad una struttura client, Client.LicenseManager() restituisce un'istanza di una struttura LicenseManager, e LicenseManager.ListLicenses() restituisce una porzione di strutture contenente le informazioni sulla licenza. Provenendo da uno sfondo Python, di solito eseguo il patch di scimmia sul metodo ListLicenses() su LicenseManger per una simulazione, ma non riesco a trovare un modello o una metodologia comparabili in Go.

A questo punto, ho cercato di creare una struttura di involucro VCenterClient con la struttura govmomi Client come membro anonimo e una funzione di "costruttore" NewVCenter() per creare nuove istanze della struttura involucro con la logica per schernisce:

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} 
} 

... ma ho problemi a utilizzare le interfacce per astrarre correttamente le strutture nidificate nella libreria govmomi. So che quanto sopra non funzionerà come govmomi.LicenseManager() restituisce una struttura di tipo govmomi.LicenseManager e il mio metodo VCenterClientInterface.LicenseManager() restituisce un'interfaccia di tipo LicenseManager. Tuttavia, sto lottando per trovare un'alternativa.

Qualsiasi aiuto su un modello di progettazione migliore o un uso corretto delle interfacce in questo caso sarebbe molto apprezzato.

risposta