2016-09-06 3 views
1

Ich versuche, Mock-Klasse für Komponententest in Golang zu bauen; weiß jemand, wie man das macht? Im folgenden Codeschnitt möchte ich beispielsweise den Rückgabewert von FakeMyClass.Object drucken.Wie man Mock-Klasse in Golang baut?

package main 

import (
    "fmt" 
) 

type MyClass struct { 
} 

func (*MyClass) Object() (int) { 
    return 0 
} 

func (mc *MyClass) PrintInfo() { 
    fmt.Printf("%v\n", mc.Object()) 
} 

type FakeMyClass struct { 
    MyClass 
} 

func (*FakeMyClass) Object() (int) { 
    return 1 
} 

func main() { 
    mc := &FakeMyClass{} 
    mc.PrintInfo() 
} 
+0

https://github.com/golang/mock –

+0

@SachinNambiarNalavattanon, nicht sicher, welche ist beliebter, Gmock oder Test ify/gespielt? –

Antwort

0

Ich ziehe github.com/stretchr/testify/tree/master/mock

package main 

import (
    "fmt" 
    "github.com/stretchr/testify/mock" 
) 

type MyClass struct { 
} 

func (*MyClass) Object() (int) { 
    return 0 
} 

func (mc *MyClass) PrintInfo() { 
    fmt.Printf("%v\n", mc.Object()) 
} 

type FakeMyClass struct { 
    mock.Mock 
} 

func (fmc *FakeMyClass) Object() (int) { 
    args := fmc.Called() 
    return args.Int(0) 
} 
func (fmc *FakeMyClass) PrintInfo() { 
    fmt.Printf("%v\n", fmc.Object()) 
} 

func main() { 
    mc := &FakeMyClass{} 
    mc.On("Object").Return(1) 
    mc.PrintInfo() 
    //mc.AssertExpectations(t) 
} 
+0

BTW sollten Sie eine Schnittstelle deklarieren, die von MyClass und FakeMyClass erfüllt wird, so können Sie beide Typen problemlos in Funktionen in den Rest Ihres Codes übergeben – Plato

0

Sie verwenden können, eine Struktur zu machen, die verspottet Funktionen gibt, die Sie mit jedem Testfall passieren in für Werte zurückgegeben werden sollen. Zum Beispiel:

package main 

import (
    "fmt" 
) 

type MyClass struct{} 

func (*MyClass) Object() int { 
    return 0 
} 
func (mc *MyClass) PrintInfo() { 
    fmt.Printf("%v\n", mc.Object()) 
} 

type FakeMyClass struct { 
    ObjectMock: func() int 
} 

func (fm *FakeMyClass) Object() int { 
    return fm.ObjectMock() 
} 
func (fm *FakeMyClass) PrintInfo() { 
    fmt.Printf("%v\n", fm.Object()) 
} 

func main() { 

    mc := &FakeMyClass{ 
     // Create the mocked function here, to be called when the Object() function is called. 
     ObjectMock: func() int { 
      return 0 
     } 
    } 

    mc.PrintInfo() 
} 
+0

das war der Ansatz, den ich vor dem Bezeugen/Mock verwendet habe, funktioniert das auch großartig – Plato

+0

I wie das Aussehen von bezeugen/spotten auch (habe es vorher nicht wirklich benutzt), schätze ich es hängt von der OP ab, die zusätzliche Paketabhängigkeiten einführen möchte oder nicht. – fitzy101

0

Sie suchen virtuelle Dispatch auf der Object() Methode. Die einzige Form des virtuellen Versands, die ich in Go kenne, ist die Verwendung von Schnittstellen.

PrintInfo wird dann eine Funktion sein, die diesen Schnittstellentyp verwendet.

ZB:

package main 

import (
    "fmt" 
) 

type WithObject interface { 
    Object() int 
} 

func PrintInfo(wo WithObject) { 
    fmt.Printf("%v\n", wo.Object()) 
} 

type MyClass struct { 
} 

func (*MyClass) Object() (int) { 
    return 0 
} 

type FakeMyClass struct { 
    MyClass 
} 

func (*FakeMyClass) Object() (int) { 
    return 1 
} 

func main() { 
    fmc := &FakeMyClass{} 
    PrintInfo(fmc) 
} 
1

I mockgen dafür verwendet:

mockgen -source myModule.go -package myPackage -destination myModuleMock.go

Sie können es installieren: wurde erhalten github.com/golang/mock