go - 如何测试在 goroutine 中调用了一个函数?

标签 go gomock

我想确保我们通过使用正确的参数调用函数来启动 goroutine。

例如:

func MyTest(t *testing.T) {
    service.EXPECT().MyMockFunc(1)
    service.MyFunc()
}

func MyFunc() {
    go MyMockFunc(1)
}

当我运行这个测试时,它失败了,因为(我相信)MyMockFunc 只在测试已经完成运行后才被调用。

有没有办法通过使用正确的参数调用函数来测试我是否启动了 goroutine?

注意:理想情况下,我希望按原样保留传递给 MyMockFunc 的参数(例如不添加 channel 参数)。

最佳答案

使用 channel 并假设您可以从测试中触发 goroutine:

package main

import (
    "fmt"
    "testing"
    "time"
)

func MyMockFunc(n int) int {
    fmt.Println("MyMockFunc is called")
    time.Sleep(5 * time.Second)
    return n + 1
}

func TestMyMockFunc(t *testing.T) {
    result := make(chan int)
    go func() {
        result <- MyMockFunc(1)
    }()
    if <-result != 2 {
        t.Fatalf("Expecting 2")
    }
}

关于go - 如何测试在 goroutine 中调用了一个函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50538340/

相关文章:

mysql - 限制最大准备语句数

go - 如何声明两种不同数据类型的多维数组

go - 模拟非接口(interface)函数

Golang : how to mock . ..interface{} arguents 使用 gomock

go - 如何在 Go 中正确测试 Controller 类

html - 如何将 Go HTML 模板嵌入到代码中?

go - 似乎无法开始使用 Go 和 Echo

exception-handling - Google Go 语言中的异常处理

unit-testing - 是否可以选择使用类似于 mockito argument captor 的东西?

unit-testing - 如何在构建期间运行 mockgen?