作者:穷游小美女 | 来源:互联网 | 2023-02-09 13:04
在Go中,如何在无需实现每种方法的情况下模拟接口?假设我有一个Car
接口和一个Corolla
实现该接口的结构:
type Car interface {
changeTire()
startEngine()
....
refuel()
}
type Corolla struct {
...
}
func (c Corolla) changeTire() {...}
func (c Corolla) startEngine() {...}
func (c Corolla) refuel() {...}
假设我还有一个Garage
依赖于的结构Car
:
type Garage struct {
MyCar Car
}
func (g Garage) PrepareCarToDrive() {
g.MyCar.changeTire()
g.MyCar.refuel()
g.MyCar.startEngine()
}
而且我想测试Garage
,所以我创建了一个MockCar
实现Car
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中执行此操作的最佳方法是什么?还是我缺少更根本的东西?
1> Andy Schweig..:
如果将接口类型本身嵌入到模拟结构中,则只能实现所需的方法。例如:
type MockCar struct {
Car
...
}
func (c MockCar) changeTire() {...}
即使您的结构仅changeTire
显式实现,它仍然满足该接口,因为该Car
字段提供了其余部分。只要您不尝试调用任何未实现的方法(这会引起恐慌,因为Car
is nil
),此方法就起作用