Go - 如何模拟需要回调的依赖项?

时间:2017-11-13 00:33:06

标签: go mocking

假设我有一个如下所示的依赖项:

[ProtoContract]
public class GeneralPacket 
{
   public uint Identity;
   [ProtoMember(1, IsRequired = true)]
   public uint Arg1;
   [ProtoMember(2, IsRequired = true)]
   public uint Arg2;
   [ProtoMember(3, IsRequired = true)]
   public uint Arg3;
}

我在代码中使用它,我想进行单元测试

type Dependency interface {
    Retrieve(transform func(row *Row) string) []string
}

这是一个人为的例子,但是考虑像gcloud pubsub这样的东西,它有一个Receive方法,它为每个消息调用一个用户定义的函数。

如果我使用mockgen来模拟Dependency,我该如何告诉mock如何表现?我想让它用一些输入集调用它的输入函数很多次。

1 个答案:

答案 0 :(得分:0)

在尝试理解您想要实现的目标时,这是一些代码。 我不使用mockgen,但是手动,你可以做你想要的。我完全改变了原始和模拟调用之间的行为。它能回答你的问题吗?

package main

import (
    "fmt"
)

var str = [...]string{
    "world",
    "night",
}

type Dependency interface {
    Get(val string) string
}

type dependency struct {
    i int
}

func (d *dependency) Get(fn func(int) string) string {
    d.i++
    d.i = d.i % len(str)

    return "hello " + fn(d.i)
}

func main() {
    d := dependency{}
    myfn := func(idx int) string { return str[idx] }
    fmt.Println(d.Get(myfn))
    fmt.Println(d.Get(myfn))
    fmt.Println(d.Get(myfn))

    m := mock{}
    fmt.Println(m.Get(myfn))
}

type mock struct {
}

func (m *mock) Get(fn func(int) string) string {
    i := 0
    j := (i + 1) % len(str)
    k := (j + 1) % len(str)

    return "mocked " + fn(i) + fn(j) + fn(k)
}

播放链接: https://play.golang.org/p/bb7WrmlIEN