Unit testing 如何仅模拟接口的一个方法

Unit testing 如何仅模拟接口的一个方法,unit-testing,go,mocking,testify,gomock,Unit Testing,Go,Mocking,Testify,Gomock,我正在努力理解Go中的mocking(我正在寻找与Mockito.spy相关的东西,相当于Go中的java) 假设我有一个包含5种方法的接口。但是我想测试的代码只引用了两个方法。现在,我如何在不实现所有方法的情况下模拟此依赖关系,即我在源代码中的实际实现实现了接口的5种方法,但有没有办法避免在测试文件中实现5种方法的虚拟接口实现。下面是我目前的做法,实现5个方法是可以管理的,但是如果接口有20个方法,那么模拟实现测试文件中的所有方法会变得很乏味 例子: handler.go中的源代码: api.

我正在努力理解Go中的mocking(我正在寻找与Mockito.spy相关的东西,相当于Go中的java)

假设我有一个包含5种方法的接口。但是我想测试的代码只引用了两个方法。现在,我如何在不实现所有方法的情况下模拟此依赖关系,即我在源代码中的实际实现实现了接口的5种方法,但有没有办法避免在测试文件中实现5种方法的虚拟接口实现。下面是我目前的做法,实现5个方法是可以管理的,但是如果接口有20个方法,那么模拟实现测试文件中的所有方法会变得很乏味

例子: handler.go中的源代码: api.go中的源代码: 测试类别代码: 问题:
有没有办法只模拟我在上面的例子中所需要的methodOne()和methodTwo()方法,而不用担心测试中剩下的方法?如果有其他替代方案,你能提出建议吗?首先谢谢你,如果你的界面有5种方法,而你只使用一种,那么你的界面太大了。使用更小的界面

type BigInterface interface {
    Thing1()
    Thing2()
    ThingN()
}

type SmallInterface interface {
    Thing1()
}

func MyFunc(i SmallInterface) { ... }
另一种选择是通过嵌入完整接口来创建完整接口的完整实现。如果您试图访问其他方法之一,这将导致恐慌,但如果您非常小心,这将适用于测试。(但请不要在生产代码中执行此操作!)


现在,
myImplementation
通过包含
BigInterface
的嵌入式实例,满足了
BigInterface
接口。如果您从未将该嵌入式实例设置为任何值,那么调用这些方法将导致死机,但您仍然可以定义
Thing1
来执行测试所需的操作。

首先,如果您的接口有5个方法,而您只使用了一个,那么您的接口太大了。使用更小的界面

type BigInterface interface {
    Thing1()
    Thing2()
    ThingN()
}

type SmallInterface interface {
    Thing1()
}

func MyFunc(i SmallInterface) { ... }
另一种选择是通过嵌入完整接口来创建完整接口的完整实现。如果您试图访问其他方法之一,这将导致恐慌,但如果您非常小心,这将适用于测试。(但请不要在生产代码中执行此操作!)


现在,
myImplementation
通过包含
BigInterface
的嵌入式实例,满足了
BigInterface
接口。如果您从未将该嵌入式实例设置为任何值,那么调用这些方法将导致死机,但您仍然可以定义
Thing1
来执行测试所需的操作。

是的,这是可能的。在结构中嵌入接口类型,并仅添加所使用的方法。请参见此处的示例:。是的,这是可能的。在结构中嵌入接口类型,并仅添加所使用的方法。请参见此处的示例:。
import "testify/mock"

func TestFeed(t *testing.T){
   mockClient := &MockClient{}
   err := processFeed(mockClient)
   assert.NotNil(t , err)
 
}

type MockClient struct {
  mock.Mock
}

  func(c *MockClient ) methodOne() error {fmt.Printf("methodOne");nil}
  func(c *MockClient ) methodTwo() error {return errors.New("mocked error")}
  func(c *MockClient ) methodThree() error {fmt.Printf("methodThree");nil}
  func(c *MockClient ) methodFour() error {fmt.Printf("methodFour");nil}
  func(c *MockClient ) methodFive() error {fmt.Printf("methodFive");nil}


type BigInterface interface {
    Thing1()
    Thing2()
    ThingN()
}

type SmallInterface interface {
    Thing1()
}

func MyFunc(i SmallInterface) { ... }
type BigInterface interface {
    Thing1()
    Thing2()
    ThingN()
}

type myImplementation struct {
    BigInterface
}

func (i *myImplementation) Thing1() { ... }