testing - 在 Go 中模拟单个方法

标签 testing go mocking

在 Go 中,如何模拟一个接口(interface)而不必实现每个方法?假设我有一个 Car 接口(interface)和一个实现该接口(interface)的 Corolla 结构:

type Car interface {
    changeTire()
    startEngine()
    ....
    refuel()
}

type Corolla struct {
    ...
}

func (c Corolla) changeTire() {...}

func (c Corolla) startEngine() {...}

func (c Corolla) refuel() {...}

假设我还有一个依赖于 CarGarage 结构:

type Garage struct {
    MyCar Car
}

func (g Garage) PrepareCarToDrive() {
    g.MyCar.changeTire()
    g.MyCar.refuel()
    g.MyCar.startEngine()
}

我想测试 Garage,所以我创建了一个实现 CarMockCar

type MockCar struct {
    ...
}

func (c MockCar) changeTire() {...}

func (c MockCar) startEngine() {...}

func (c MockCar) refuel() {...}

现在我有测试 PrepareCarToDrive 的测试,我使用 MockCar:

func TestGarage_PrepareCarToDrive_DoesSomething(t *testing.T) {
    mockCar := MockCar{}
    garageUnderTest := Garage{}
    garageUnderTest.MyCar = mockCar

    // some other setup

    // when Garage calls mockCar.changeTire(), should do X
    ...
}

func TestGarage_PrepareCarToDrive_DoesSomethingElse(t *testing.T) {
    mockCar := MockCar{}
    garageUnderTest := Garage{}
    garageUnderTest.MyCar = mockCar

    // some other setup 
    // when Garage calls mockCar.changeTire(), should do Y
    ...
}

我的问题是,如何让 mockCar 在每次测试中做不同的事情?我知道我可以为每个测试创建一个不同的 Car 模拟实现。但随着我向 Car 添加更多方法,这很快就会失控。

我有 Java 背景,所以我正在寻找类似 Mockito 的东西,它可以让我模拟每次测试所需的方法。

在 Go 中执行此操作的最佳方法是什么?还是我遗漏了一些更基本的东西?

最佳答案

如果您将接口(interface)类型本身嵌入到您的模拟结构中,那么您就可以只实现您需要的方法。例如:

type MockCar struct {
    Car
    ...
}

func (c MockCar) changeTire() {...}

即使您的结构仅显式实现了 changeTire,它仍然满足接口(interface),因为 Car 字段提供了其余部分。只要您不尝试调用任何未实现的方法(这将导致 panic ,因为 Carnil),这就会起作用

关于testing - 在 Go 中模拟单个方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42724913/

相关文章:

java - 如何使用 JUnit 测试依赖于环境变量的代码?

javascript - 单击具有与文本匹配的相同类的元素并退出 Protractor

regex - Golang正则表达式: Getting index position of variable

c# - 人们在使用 Rhino Mocks 的 ASP.NET MVC 中将哪些资源用于 TDD?

java - 我怎样才能模拟一个非空值?

unit-testing - 闭包内的 mock 模拟方法

ruby-on-rails - 我如何测试 ActionMailer?

user-interface - 在 Xamarin UI 测试中需要帮助

goimports 不适用于 vim-go 插件

amazon-web-services - 如何在 AWS Lambda 中创建身份验证中间件