函数在golang中通过接口进行模拟

时间:2017-04-14 09:14:57

标签: oop go interface mocking dependencies

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

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

1 个答案:

答案 0 :(得分: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
}

嵌入

  

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

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