agiledragon / gomonkey

gomonkey is a library to make monkey patching in unit tests easy
MIT License
1.92k stars 178 forks source link

gomonkey 中有异步携程时,mock的方法会失效 #158

Closed zhangbin116 closed 6 days ago

zhangbin116 commented 5 months ago

func methodA(){

... go methodB() .... }

gomonkey.ApplyFunctionReturn(methodB) linux环境下,不生效

someview commented 2 months ago

我也遇到这个问题. 环境: win11, amd64, go1.22, gomonkey v2.11.0

type A struct { ants.Pool}
func(a *A)methodA(){  
    s.Pool.Submit(func(){ a.methodB() })
 }
func(a *A)methodB(){}

在测试时,发现applyPrivateMethod无法生效, 不过applyMethod是生效的。 对于gomonkey的原理完全不了解, 是否可以帮忙看看呢。

xhd2015 commented 2 months ago

我也遇到这个问题. 环境: win11, amd64, go1.22

type A struct { ants.Pool}
func(a *A)methodA(){  
    s.Pool.Submit(func(){ a.methodB() })
 }
func(a *A)methodB(){}

在测试时,发现applyPrivateMethod无法生效。 对于gomonkey的原理完全不了解, 是否可以帮忙看看呢。

Gomonkey的mock并发不安全,可以尝试一下xgo,对比可以参考这里:https://github.com/agiledragon/gomonkey/issues/157#issuecomment-2068470045

someview commented 2 months ago

我也遇到这个问题. 环境: win11, amd64, go1.22

type A struct { ants.Pool}
func(a *A)methodA(){  
    s.Pool.Submit(func(){ a.methodB() })
 }
func(a *A)methodB(){}

在测试时,发现applyPrivateMethod无法生效。 对于gomonkey的原理完全不了解, 是否可以帮忙看看呢。

Gomonkey的mock并发不安全,可以尝试一下xgo,对比可以参考这里:#157 (comment)

有时间瞅瞅,不过测试的过程中没有并发的情况,gomonkey也不支持

duxiaogang commented 1 month ago

我也遇到这个问题. 环境: win11, amd64, go1.22

type A struct { ants.Pool}
func(a *A)methodA(){  
    s.Pool.Submit(func(){ a.methodB() })
 }
func(a *A)methodB(){}

在测试时,发现applyPrivateMethod无法生效。 对于gomonkey的原理完全不了解, 是否可以帮忙看看呢。

Gomonkey的mock并发不安全,可以尝试一下xgo,对比可以参考这里:#157 (comment)

gomonkey并发不安全指的是什么?apply patch的时候吗?其他地方似乎没有问题

apply patch也可以通过预先stw来解决

xhd2015 commented 1 month ago

我也遇到这个问题. 环境: win11, amd64, go1.22

type A struct { ants.Pool}
func(a *A)methodA(){  
    s.Pool.Submit(func(){ a.methodB() })
 }
func(a *A)methodB(){}

在测试时,发现applyPrivateMethod无法生效。 对于gomonkey的原理完全不了解, 是否可以帮忙看看呢。

Gomonkey的mock并发不安全,可以尝试一下xgo,对比可以参考这里:#157 (comment)

gomonkey并发不安全指的是什么?apply patch的时候吗?其他地方似乎没有问题

apply patch也可以通过预先stw来解决

stw怎么执行呢?我没有看到相关的教程哈哈😆

并发不安全是因为gomoneky会修改内存中的数据,多个协程并发patch,就会出现data race,所以导致数据错乱,程序崩溃。

duxiaogang commented 1 month ago

我也遇到这个问题. 环境: win11, amd64, go1.22

type A struct { ants.Pool}
func(a *A)methodA(){  
    s.Pool.Submit(func(){ a.methodB() })
 }
func(a *A)methodB(){}

在测试时,发现applyPrivateMethod无法生效。 对于gomonkey的原理完全不了解, 是否可以帮忙看看呢。

Gomonkey的mock并发不安全,可以尝试一下xgo,对比可以参考这里:#157 (comment)

gomonkey并发不安全指的是什么?apply patch的时候吗?其他地方似乎没有问题 apply patch也可以通过预先stw来解决

stw怎么执行呢?我没有看到相关的教程哈哈😆

并发不安全是因为gomoneky会修改内存中的数据,多个协程并发patch,就会出现data race,所以导致数据错乱,程序崩溃。

不是gomonkey自己提供的,是另外一个项目,mockey

https://github.com/bytedance/mockey/blob/main/internal/monkey/mem/write.go

xhd2015 commented 1 month ago

算是一种hack,不过go1.23即将禁止go:linkname引用标准库未导出的函数了。所有这些hack最终都将失效。