2016-09-06 5 views
1

Я пытаюсь построить макет класса для модульного теста в голанге; Кто-нибудь знает как это сделать? Например, в следующем фрагменте кода я хотел бы напечатать возвращаемое значение FakeMyClass.Object.Как построить классный класс в голанге?

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, не уверен, какой из них более популярен, gmock или test ify/mock? –

ответ

0

Я предпочитаю использовать 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 вы должны объявить интерфейс, который выполняется MyClass и FakeMyClass, так что вы можете с радостью передать любой из них в функции в остальной части вашего кода. – Plato

0

Вы можете сделать структуру, которая возвращает издевались функции, которые вы проходите в с каждым тестом для значений, которые вы хотите вернулись. Например:

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

это был подход, который я использовал до поиска показаний/mock, это тоже отлично работает – Plato

+0

I как и внешний вид testify/mock (ранее не использовал его), я полагаю, что он зависит от OP, который хочет ввести дополнительные зависимости пакета или нет. – fitzy101

0

Вы ищете виртуальную отправку по методу Object(). Единственная форма виртуальной отправки, о которой я знаю в Go, - это использование интерфейсов.

PrintInfo будет функцией, которая использует этот тип интерфейса.

Например:

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

Я использовал mockgen для него:

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

Вы можете установить его: получил получить github.com/golang/mock

Смежные вопросы