mock: Mock.MethodCalled 不应调用参数的方法
作者: philflip12创建于 2025年3月25日更新于 2026年5月24日
标签bugpkg-mockconcurrencymock.ArgumentMatcherconcurreny/deadlock
描述
Mock.MethodCalled 会调用 Mock.mutex.Lock。然后,它调用 Mock.findExpectedCall,该方法搜索 Mock 的预期调用列表。当它遇到一个可能匹配的调用时,它会调用 Diff 来处理参数。这会使用格式指定符 %v 将参数转换为字符串。如果参数实现了 Stringer 接口,则可以调用其 String 方法。最终,必须避免调用正在比较的参数上的任何方法,因为这可能会导致意外行为。我的具体示例是,如果参数恰好是最初触发 Mock.MethodCalled 的同一接口,则 Mock.MethodCalled 将再次被调用,但这次是从第一次调用中调用,并且 Mock.mutex.Lock 将再次被调用,导致死锁。
内容来源: stretchr/testify