热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在Go中模拟单个方法

如何解决《在Go中模拟单个方法》经验,为你挑选了1个好方法。

在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字段提供了其余部分。只要您不尝试调用任何未实现的方法(这会引起恐慌,因为Caris nil),此方法就起作用


推荐阅读
author-avatar
穷游小美女
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有