【问题标题】:function Mocking through Interface in golang在golang中通过接口模拟功能
【发布时间】:2017-09-10 13:01:42
【问题描述】:

我正在尝试编写一个单元测试代码形式,其代码如下,具有 3 级函数调用:

主函数调用函数 A(),然后函数 A 根据某些条件调用函数 B() 和 C(),函数 B 调用函数 E() 和 F(),而函数 C 调用函数 G() 和H() 在某些条件下。
上面就像我开发的代码一样,这里我想模拟函数 B 的函数 E() 和 F(),以及函数 C 的 G() 和 H()。请建议我如何使用接口来模拟。

【问题讨论】:

  • 这个问题是完整的吗?
  • 请尽可能简化您的代码,但要传达总体思路。大多数实际问题都需要发布您的代码。保持干净整洁。
  • 有上百万种方法可以满足您的要求,具体取决于您使用的功能。请粘贴您的代码。

标签: oop go interface mocking dependencies


【解决方案1】:

Abstract function type

你可以通过依赖注入而不是使用接口来做到这一点:

import (
    "fmt"
    "math"
)

type a func(float64) float64

func A(arg float64) float64 {
    return math.Pow(arg, 2)
}

func mock(arg float64) float64 {
    return math.Sqrt(arg)
}

func b(function a, arg float64) float64 {
    return function(arg)
}

func main() {
    fmt.Println(b(A, 2))
    fmt.Println(b(mock, 2))
}

函数是 Go 中的一等公民

在编程语言设计中,给定编程语言中的一等公民(也是类型、对象、实体或值)是支持其他实体通常可用的所有操作的实体。

这意味着您可以将函数作为参数传递给其他可能性。当然你也可以根据具体接口的函数声明一个抽象类型(不要和interface类型混淆)

Interface approach

您可以使用您的函数进行合成

import (
    "fmt"
    "math"
)

// Declare an interface type with dependencies
type HGer interface {
    H(float64) float64
    G(float64) float64
}

// Declare a dependent type with embedded interface
type Dependent struct {
    HGer
}

func (d *Dependent) B(arg float64) float64 {
    return d.H(arg) * d.G(arg)
}

// Implement the interface for an actual program
type ImplHGer struct{}

func (i *ImplHGer) H(arg float64) float64 {
    return math.Pow(arg, 2)
}

func (i *ImplHGer) G(arg float64) float64 {
    return math.Sqrt(arg)
}

// Implement the interface for mock of dependencies
type MockHGer struct{}

func (i *MockHGer) H(arg float64) float64 {
    return float64(0)
}

func (i *MockHGer) G(arg float64) float64 {
    return float64(0)
}

func main() {
    // Use real implementation
    a := Dependent{new(ImplHGer)}
    // Use the mock
    b := Dependent{new(MockHGer)}
    fmt.Println(a.B(8)) // 181.01933598375618
    fmt.Println(b.B(8)) // 0
}

嵌入

在结构中包含匿名字段称为嵌入。在这种情况下,折扣类型嵌入在 PremiumDiscount 类型中。 PremiumDiscount 类型可立即使用所有折扣方法。此外,这些相同的方法可以隐藏

可以将接口嵌入到结构中以扩展其行为或更具体 - 声明抽象依赖。

【讨论】:

  • @Vicky,您能否将代码 sn-p 和 play.go 链接添加到您的问题。 Stackoverflow 问题可以而且应该对其他人有用,人们会感激你。保持你的业力光明的一面。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-18
  • 2018-10-28
  • 2016-06-09
  • 1970-01-01
  • 2015-04-09
  • 2016-09-21
  • 1970-01-01
相关资源
最近更新 更多