【发布时间】:2017-03-10 18:00:35
【问题描述】:
在 Go 中,如何模拟接口而不需要实现每个方法?假设我有一个Car 接口和一个实现该接口的Corolla 结构:
type Car interface {
changeTire()
startEngine()
....
refuel()
}
type Corolla struct {
...
}
func (c Corolla) changeTire() {...}
func (c Corolla) startEngine() {...}
func (c Corolla) refuel() {...}
假设我还有一个依赖于Car 的Garage 结构:
type Garage struct {
MyCar Car
}
func (g Garage) PrepareCarToDrive() {
g.MyCar.changeTire()
g.MyCar.refuel()
g.MyCar.startEngine()
}
我想测试Garage,所以我创建了一个实现Car的MockCar
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 中执行此操作的最佳方法是什么?还是我错过了一些更基本的东西?
【问题讨论】: