证明模拟单个方法

I'm pretty new to go. I'm trying to mock a single method of a struct using testify, but I don't know how to do it.

Here's the code:

type HelloWorlder interface {
    SayHello() string
    GetName() string
}

type HelloWorld struct{}

func (hw *HelloWorld) SayHello() string {
    return fmt.Sprintf("Hello World from %s!", hw.GetName())
}

func (hw *HelloWorld) GetName() string {
    return "se7entyse7en"
}

and here's the test:

type MockHelloWorld struct {
    mock.Mock
    HelloWorld
}

func (m *MockHelloWorld) GetName() string {
    args := m.Called()
    return args.String(0)
}

type SomeTestSuite struct {
    suite.Suite
}

func (s *SomeTestSuite) TestMocking() {
    mhw := new(MockHelloWorld)
    mhw.On("GetName").Return("foo bar")

    fmt.Println(mhw.SayHello())
}

The idea is to mock only the GetName method so that it prints Hello World from foo bar!. Is that possible?

For those familiar with Python, what I'm trying to achieve is similar to what the unittest.Mock class permits through the wraps argument.

UPDATE The imported packages from testify are these:

    "github.com/stretchr/testify/mock"
    "github.com/stretchr/testify/suite"

Maybe this will help you.

package main

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

type userReader interface {
    ReadUserInfo(int) int
}

type userWriter interface {
    WriteUserInfo(int)
}

type UserRepository struct {
    userReader
    userWriter
}

type realRW struct{}

func (db *realRW) ReadUserInfo(i int) int {
    return i
}

func (db *realRW) WriteUserInfo(i int) {
    fmt.Printf("put %d to db.
", i)
}

// this is mocked struct for test writer.
type MyMockedWriter struct {
    mock.Mock
}

func (m *MyMockedWriter) ReadUserInfo(i int) int {

    args := m.Called(i)
    return args.Int(0)

}

func main() {
    rw := &realRW{}
    repo := UserRepository{
        userReader: rw,
        userWriter: rw,
    }
    fmt.Println("Userinfo is:", repo.ReadUserInfo(100))
    repo.WriteUserInfo(100)

    // when you want to write test.
    fmt.Println("Begin test....................")
    testObj := new(MyMockedWriter)
    testObj.On("ReadUserInfo", 123).Return(250)

    testRepo := UserRepository{
        userReader: testObj,
        userWriter: rw,
    }
    fmt.Println("Userinfo is:", testRepo.ReadUserInfo(123))
    testRepo.WriteUserInfo(100)
}

// Output:
// Userinfo is: 100
// put 100 to db.
// Begin test....................
// Userinfo is: 250
// put 100 to db.

Good luck.