在 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() {...}
假设我还有一个依赖于 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 中执行此操作的最佳方法是什么?还是我遗漏了一些更基本的东西?
最佳答案
如果您将接口(interface)类型本身嵌入到您的模拟结构中,那么您就可以只实现您需要的方法。例如:
type MockCar struct {
Car
...
}
func (c MockCar) changeTire() {...}
即使您的结构仅显式实现了 changeTire
,它仍然满足接口(interface),因为 Car
字段提供了其余部分。只要您不尝试调用任何未实现的方法(这将导致 panic ,因为 Car
是 nil
),这就会起作用
关于testing - 在 Go 中模拟单个方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42724913/