【问题标题】:How to mock docker ApiClient in Golang?如何在 Golang 中模拟 docker ApiClient?
【发布时间】:2021-07-24 13:48:46
【问题描述】:

我已经为Docker ApiClient 实现了一个包装器,就像这样

type DockerClient struct {
    cli client.APIClient
}

我还定义了自己的接口,用于像这样与 Docker 交互

type Dockerer interface {
    Init() error
    CreateContainer(ctx context.Context, imageName string) (string, error)
    RunCommand(ctx context.Context, containerId string, command string) (string, int, error)
    StopContainer(ctx context.Context, containerId string) error
}

DockerClient 实现Dockerer 接口中的函数如下:

func (d *DockerClient) Init() error {
    //...
}

func (d *DockerClient) CreateContainer(ctx context.Context, imageName string) (string, error) {
    //...
}


func (d *DockerClient) RunCommand(ctx context.Context, containerId string, command string) (string, int, error) {
    //...
}

func (d *DockerClient) StopContainer(ctx context.Context, containerId string) error {
    //...
}

这使得测试需要与 Docker 接口的代码组件变得很容易,因为我可以为我的 Dockerer 接口生成一个模拟并依赖注入该模拟。

但是,现在我想为DockerClient 包装器的实际实现编写测试。 docker 包似乎没有为 ApiClient 提供模拟。当我需要使用的包不提供模拟时,是否有用于编写测试的规范模式?有没有办法让mockery 为库接口生成模拟?

【问题讨论】:

    标签: docker unit-testing go


    【解决方案1】:

    client.APIClient 是一个接口。您可以将该接口嵌入到结构中。是的,你可以这样做。 您可以在结构中嵌入接口。然后您可以选择性地实现测试所需的方法。这样你就不必从接口实现每一个方法。实现client.APIClient 提供的所有方法是不切实际的,因为它嵌入了嵌入大量接口的接口。 See.

    这样,

    
    type mockCli struct{
       client.APIClient
    }
    
    func (mockCli) ClientVersion() string {
       return "5"
    }
    
    
    func TestA(t *testing.T) {
       dc := &DockerClient{
          cli: new(mockCli),
       }
    
       ...
    
       dc.Init() 
       // This will print "5" if your Init has 
       // fmt.Println(d.cli.ClientVersion())) somewhere.
    
       // If you call any other method of cli, you get panic. 
       // A good thing. It will inform you that you are using 
       // some method that you don't have on mockCli. You 
       // just add it then. 
       
    }
    
    

    【讨论】:

    • 啊,很酷。有没有办法利用这个想法和 mockery,以便我可以在实现所有接口的情况下进行 mock 实现?
    • 不知道。我没用过嘲讽。
    猜你喜欢
    • 1970-01-01
    • 2019-09-15
    • 2021-12-24
    • 2020-02-20
    • 2017-08-07
    • 2017-06-04
    • 2019-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多