在编写测试时,我必须修补一个方法以检查它是否被调用,这是我的代码:
import "fmt"
type myStruct struct {}
func (myObject *myStruct) firstMethod() {
myObject.SecondMethod()
}
func (myObject *myStruct) SecondMethod() {
fmt.Println("Inside the original SecondMethod") //test fails if I remove this
}
这是测试:
import (
"reflect"
"testing"
"github.com/bouk/monkey"
"github.com/stretchr/testify/assert"
"fmt"
)
func TestThatSecondMethodIsCalled(t *testing.T) {
myObject := &myStruct{}
wasCalled := false
monkey.PatchInstanceMethod(
reflect.TypeOf(myObject),
"SecondMethod",
func(*myStruct) {
fmt.Println("Inside the replacement of SecondMethod")
wasCalled = true
},
)
myObject.firstMethod()
assert.True(t, wasCalled)
}
如果我像这样运行测试,它将通过,但是如果我从SecondMethod中删除
fmt.Println()
,则测试将失败(该测试使用方法的原始主体,而不是已修补的主体)。另外,如果我使用Goland的调试功能,即使SecondMethod的正文为空,测试也会通过。
最佳答案
这是由编译器的内联优化引起的,添加-gcflags="-N -I"
将禁用它。
关于unit-testing - 删除fmt.Println()时,golang中的猴子修补失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51521539/