Skip to content

同一文件中多个测试函数,mock同一函数时,多次运行结果不一致(正确/错误/panic) #91

@zyy329

Description

@zyy329

github.com/bytedance/mockey v1.2.14
go 1.24.4
运行命令: go test -gcflags="all=-l -N" -parallel=1

code:

func funcA() int {
	return 0 
}

func TestMock1(t *testing.T) {
	mockey.PatchConvey("mock 1", t, func() {
		convey.So(funcA(), convey.ShouldEqual, 0)
		mockey.PatchConvey("mock 1 in", func() {
			logz.Info().Msg("mock 1")
			mockey.Mock(funcA).Return(1).Build()
			convey.So(funcA(), convey.ShouldEqual, 1)
		})
	})
}

func TestMock2(t *testing.T) {
	mockey.PatchConvey("mock 2", t, func() {
		convey.So(funcA(), convey.ShouldEqual, 0)
		mockey.PatchConvey("mock 2 in", func() {
			//r := rand.IntN(100)
			r := 2
			mockey.Mock(funcA).Return(r).Build()
			logz.Info().Msgf("%d", r)
			convey.So(funcA(), convey.ShouldEqual, r)
		})
	})
}

TestMock1, TestMock2 单独运行都总是正确, 但整个文件一起跑测试时,结果不定

  1. 都正确通过测试
  2. mock 不符合预期, 比如:
    Expected: 2
    Actual: 0
    (Should equal)!
  3. 引发panic, 报错信息如下:
    [convery_mock] (unit_test =) $ go test -gcflags="all=-l -N" -parallel=1
    .09-28 18:24:45.098 INF convey_test.go:39 > mock 1
    .
    2 total assertions

.09-28 18:24:45.099 INF convey_test.go:53 > 2
runtime: g 5: unexpected return pc for nova/unittest/example/convery_mock.TestMock2.func1.1 called from 0x14000204130
stack: frame={sp:0x140002040e0, fp:0x140002041e0} stack=[0x14000200000,0x14000208000)
0x0000014000203fe0: 0x0000000000000000 0x00000001044fa801
0x0000014000203ff0: 0x000001400007df20 0x0000014000204038
0x0000014000204000: 0x00000001042d89cc <github.com/smartystreets/goconvey/convey.mustGetCurrentContext+0x000000000000004c> 0x000000010449c1e0
0x0000014000204010: 0x000001400007df20 0x0000000000000000
0x0000014000204020: 0x0000000000000000 0x000001400007df20
0x0000014000204030: 0x000001400007df20 0x0000014000204088
0x0000014000204040: 0x00000001042db6f4 <github.com/smartystreets/goconvey/convey.So+0x0000000000000034> 0x000000010443f899
0x0000014000204050: 0x0000000000000078 0x0000000000000000
0x0000014000204060: 0x0000000000000000 0x0000000000000000
0x0000014000204070: 0x000001400000f3a0 0x0000000000000000
0x0000014000204080: 0x0000000000000000 0x00000140002040d8
0x0000014000204090: 0x00000001044134a8 <nova/unittest/example/convery_mock.TestMock2.func1.1+0x0000000000000218> 0x0000000000000001
0x00000140002040a0: 0x0000014000132a80 0x00000140002040d8
0x00000140002040b0: 0x000000010441342c <nova/unittest/example/convery_mock.TestMock2.func1.1+0x000000000000019c> 0x0000000000000008
0x00000140002040c0: 0x000000010448ba40 0x0000014000132a00
0x00000140002040d0: 0x0000000000000000 0x0000000000000002
0x00000140002040e0: <0x0000014000204130 0x000000010448b540
0x00000140002040f0: 0x000000010445e020 0x00000001044f8028
0x0000014000204100: 0x0000014000023e90 0x0000000000000001
0x0000014000204110: 0x0000000000000001 0x0000014000023d90
0x0000014000204120: 0x0000000000000000 0x0000000000000001
0x0000014000204130: 0x000000010448b540 0x000000010445e030
0x0000014000204140: 0x0000014000132a80 0x000001400002e640
0x0000014000204150: 0x000001400002e640 0x0000000000000000
0x0000014000204160: 0x0000000000000000 0x0000000000000000
0x0000014000204170: 0x0000000000000000 0x000001400000f3a0
0x0000014000204180: 0x0000014000023e90 0x0000014000023e90
0x0000014000204190: 0x0000000000000001 0x0000000000000001
0x00000140002041a0: 0x000000010445e020 0x0000000000000001
0x00000140002041b0: 0x00000001044f7980 0x00000140002041d8
0x00000140002041c0: 0x000000010414b614 <runtime.reflectcall+0x0000000000000034> 0x000001400007e480
0x00000140002041d0: 0x0000000000000000 0x0000014000204218
0x00000140002041e0: >0x00000001041c7b30 <reflect.Value.call+0x0000000000000a00> 0x000001400007d410
0x00000140002041f0: 0x00000001044f7978 0x0000000000000000
0x0000014000204200: 0x0000000000000000 0x0000014000000000
0x0000014000204210: 0x00000140002045b8 0x0000014000204c88
0x0000014000204220: 0x00000001041c70e4 <reflect.Value.Call+0x0000000000000074> 0x0000000000000000
0x0000014000204230: 0x0000000000000008 0x0000000000000000
0x0000014000204240: 0x0000000000000000 0x0000000000000000
0x0000014000204250: 0x0000000000000000 0x0000000000000000
0x0000014000204260: 0x0000000000000000 0x0000000000000000
0x0000014000204270: 0x0000000000000000 0x0000000000000000
0x0000014000204280: 0x0000000000000000 0x0000000000000000
0x0000014000204290: 0x0000000000000000 0x0000000000000000
0x00000140002042a0: 0x0000000000000000 0x0000000000000000
0x00000140002042b0: 0x0000000000000000 0x0000000000000000
0x00000140002042c0: 0x0000000000000000 0x0000000000000000
0x00000140002042d0: 0x000001400007e480 0x0000000000000000
fatal error: unknown caller pc

runtime stack:
runtime.throw({0x104430809?, 0x104670000?})
/usr/local/go/src/runtime/panic.go:1101 +0x38 fp=0x16bd2efe0 sp=0x16bd2efb0 pc=0x104142018
runtime.(unwinder).next(0x16bd2f0b0)
/usr/local/go/src/runtime/traceback.go:470 +0x2e0 fp=0x16bd2f070 sp=0x16bd2efe0 pc=0x1041333e0
runtime.(
_panic).nextFrame.func1()
/usr/local/go/src/runtime/panic.go:969 +0x84 fp=0x16bd2f130 sp=0x16bd2f070 pc=0x10410d894
runtime.systemstack(0x16bd1f170)
/usr/local/go/src/runtime/asm_arm64.s:244 +0x6c fp=0x16bd2f140 sp=0x16bd2f130 pc=0x1041470bc

goroutine 5 gp=0x14000003500 m=0 mp=0x1046e6de0 [running]:
runtime.systemstack_switch()
/usr/local/go/src/runtime/asm_arm64.s:201 +0x8 fp=0x14000203ee0 sp=0x14000203ed0 pc=0x104147038
runtime.(_panic).nextFrame(0x28?)
/usr/local/go/src/runtime/panic.go:942 +0x60 fp=0x14000203f20 sp=0x14000203ee0 pc=0x10410d7e0
runtime.(
_panic).start(0x14000203f80, 0x1042d8848, 0x14000204000)
/usr/local/go/src/runtime/panic.go:856 +0x1b8 fp=0x14000203f50 sp=0x14000203f20 pc=0x10410d568
panic({0x10449c1e0?, 0x1400007df20?})
/usr/local/go/src/runtime/panic.go:786 +0xe0 fp=0x14000204000 sp=0x14000203f50 pc=0x104141ce0
github.com/smartystreets/goconvey/convey.conveyPanic({0x10443f899, 0x78}, {0x0, 0x0, 0x0})
/Users/cloud/go/pkg/mod/github.com/smartystreets/[email protected]/convey/context.go:20 +0xa8 fp=0x14000204040 sp=0x14000204000 pc=0x1042d8848
github.com/smartystreets/goconvey/convey.mustGetCurrentContext()
/Users/cloud/go/pkg/mod/github.com/smartystreets/[email protected]/convey/context.go:52 +0x4c fp=0x14000204090 sp=0x14000204040 pc=0x1042d89cc
github.com/smartystreets/goconvey/convey.So({0x10448b540, 0x10445e020}, 0x1044f8028, {0x14000023e90, 0x1, 0x1})
/Users/cloud/go/pkg/mod/github.com/smartystreets/[email protected]/convey/doc.go:126 +0x34 fp=0x140002040e0 sp=0x14000204090 pc=0x1042db6f4
nova/unittest/example/convery_mock.TestMock2.func1.1()
/Users/cloud/Code/work/platform/common/nova/unittest/example/convery_mock/convey_test.go:54 +0x218 fp=0x140002041e0 sp=0x140002040e0 pc=0x1044134a8
runtime: g 5: unexpected return pc for nova/unittest/example/convery_mock.TestMock2.func1.1 called from 0x14000204130
stack: frame={sp:0x140002040e0, fp:0x140002041e0} stack=[0x14000200000,0x14000208000)
0x0000014000203fe0: 0x0000000000000000 0x00000001044fa801
0x0000014000203ff0: 0x000001400007df20 0x0000014000204038
0x0000014000204000: 0x00000001042d89cc <github.com/smartystreets/goconvey/convey.mustGetCurrentContext+0x000000000000004c> 0x000000010449c1e0
0x0000014000204010: 0x000001400007df20 0x0000000000000000
0x0000014000204020: 0x0000000000000000 0x000001400007df20
0x0000014000204030: 0x000001400007df20 0x0000014000204088
0x0000014000204040: 0x00000001042db6f4 <github.com/smartystreets/goconvey/convey.So+0x0000000000000034> 0x000000010443f899
0x0000014000204050: 0x0000000000000078 0x0000000000000000
0x0000014000204060: 0x0000000000000000 0x0000000000000000
0x0000014000204070: 0x000001400000f3a0 0x0000000000000000
0x0000014000204080: 0x0000000000000000 0x00000140002040d8
0x0000014000204090: 0x00000001044134a8 <nova/unittest/example/convery_mock.TestMock2.func1.1+0x0000000000000218> 0x0000000000000001
0x00000140002040a0: 0x0000014000132a80 0x00000140002040d8
0x00000140002040b0: 0x000000010441342c <nova/unittest/example/convery_mock.TestMock2.func1.1+0x000000000000019c> 0x0000000000000008
0x00000140002040c0: 0x000000010448ba40 0x0000014000132a00
0x00000140002040d0: 0x0000000000000000 0x0000000000000002
0x00000140002040e0: <0x0000014000204130 0x000000010448b540
0x00000140002040f0: 0x000000010445e020 0x00000001044f8028
0x0000014000204100: 0x0000014000023e90 0x0000000000000001
0x0000014000204110: 0x0000000000000001 0x0000014000023d90
0x0000014000204120: 0x0000000000000000 0x0000000000000001
0x0000014000204130: 0x000000010448b540 0x000000010445e030
0x0000014000204140: 0x0000014000132a80 0x000001400002e640
0x0000014000204150: 0x000001400002e640 0x0000000000000000
0x0000014000204160: 0x0000000000000000 0x0000000000000000
0x0000014000204170: 0x0000000000000000 0x000001400000f3a0
0x0000014000204180: 0x0000014000023e90 0x0000014000023e90
0x0000014000204190: 0x0000000000000001 0x0000000000000001
0x00000140002041a0: 0x000000010445e020 0x0000000000000001
0x00000140002041b0: 0x00000001044f7980 0x00000140002041d8
0x00000140002041c0: 0x000000010414b614 <runtime.reflectcall+0x0000000000000034> 0x000001400007e480
0x00000140002041d0: 0x0000000000000000 0x0000014000204218
0x00000140002041e0: >0x00000001041c7b30 <reflect.Value.call+0x0000000000000a00> 0x000001400007d410
0x00000140002041f0: 0x00000001044f7978 0x0000000000000000
0x0000014000204200: 0x0000000000000000 0x0000014000000000
0x0000014000204210: 0x00000140002045b8 0x0000014000204c88
0x0000014000204220: 0x00000001041c70e4 <reflect.Value.Call+0x0000000000000074> 0x0000000000000000
0x0000014000204230: 0x0000000000000008 0x0000000000000000
0x0000014000204240: 0x0000000000000000 0x0000000000000000
0x0000014000204250: 0x0000000000000000 0x0000000000000000
0x0000014000204260: 0x0000000000000000 0x0000000000000000
0x0000014000204270: 0x0000000000000000 0x0000000000000000
0x0000014000204280: 0x0000000000000000 0x0000000000000000
0x0000014000204290: 0x0000000000000000 0x0000000000000000
0x00000140002042a0: 0x0000000000000000 0x0000000000000000
0x00000140002042b0: 0x0000000000000000 0x0000000000000000
0x00000140002042c0: 0x0000000000000000 0x0000000000000000
0x00000140002042d0: 0x000001400007e480 0x0000000000000000
created by testing.(*T).Run in goroutine 1
/usr/local/go/src/testing/testing.go:1851 +0x744

goroutine 1 gp=0x140000021c0 m=nil [chan receive]:
runtime.gopark(0x1044f7a48, 0x140000724c0, 0xe, 0x7, 0x2)
/usr/local/go/src/runtime/proc.go:435 +0xdc fp=0x14000145350 sp=0x14000145320 pc=0x10414214c
runtime.chanrecv(0x14000072460, 0x1400014544e, 0x1)
/usr/local/go/src/runtime/chan.go:664 +0x2b4 fp=0x140001453d0 sp=0x14000145350 pc=0x1040dea24
runtime.chanrecv1(0x1046ddac0?, 0x10448b300?)
/usr/local/go/src/runtime/chan.go:506 +0x14 fp=0x14000145400 sp=0x140001453d0 pc=0x1040de764
testing.(*T).Run(0x140000036c0, {0x10442c117, 0x9}, 0x1044f78d0)
/usr/local/go/src/testing/testing.go:1859 +0x764 fp=0x14000145670 sp=0x14000145400 pc=0x104214464
testing.runTests.func1(0x14000003180)
/usr/local/go/src/testing/testing.go:2279 +0x98 fp=0x14000145710 sp=0x14000145670 pc=0x104217ad8
testing.tRunner(0x14000003180, 0x14000145900)
/usr/local/go/src/testing/testing.go:1792 +0x1a8 fp=0x14000145800 sp=0x14000145710 pc=0x104212d68
testing.runTests(0x1400000c1e0, {0x1046c6e40, 0x2, 0x2}, {0xc22e61b145dd4438, 0x8bb2e3accd, 0x1046e6220})
/usr/local/go/src/testing/testing.go:2277 +0x520 fp=0x14000145990 sp=0x14000145800 pc=0x104217930
testing.(*M).Run(0x14000102a00)
/usr/local/go/src/testing/testing.go:2142 +0xb08 fp=0x14000145ed0 sp=0x14000145990 pc=0x104215798
main.main()
_testmain.go:47 +0x98 fp=0x14000145f60 sp=0x14000145ed0 pc=0x1044138f8
runtime.main()
/usr/local/go/src/runtime/proc.go:283 +0x224 fp=0x14000145fd0 sp=0x14000145f60 pc=0x104110ba4
runtime.goexit({})
/usr/local/go/src/runtime/asm_arm64.s:1223 +0x4 fp=0x14000145fd0 sp=0x14000145fd0 pc=0x104149434

goroutine 17 gp=0x14000082380 m=nil [force gc (idle)]:
runtime.gopark(0x1044f7d50, 0x1046dd270, 0x11, 0xa, 0x1)
/usr/local/go/src/runtime/proc.go:435 +0xdc fp=0x1400004c770 sp=0x1400004c740 pc=0x10414214c
runtime.goparkunlock(0x1046dd270?, 0x0?, 0x0?, 0x0?)
/usr/local/go/src/runtime/proc.go:441 +0x34 fp=0x1400004c7a0 sp=0x1400004c770 pc=0x104111034
runtime.forcegchelper()
/usr/local/go/src/runtime/proc.go:348 +0xb4 fp=0x1400004c7d0 sp=0x1400004c7a0 pc=0x104110f04
runtime.goexit({})
/usr/local/go/src/runtime/asm_arm64.s:1223 +0x4 fp=0x1400004c7d0 sp=0x1400004c7d0 pc=0x104149434
created by runtime.init.7 in goroutine 1
/usr/local/go/src/runtime/proc.go:336 +0x24

goroutine 18 gp=0x14000082540 m=nil [GC sweep wait]:
runtime.gopark(0x1044f7d50, 0x1046dd920, 0xc, 0x9, 0x1)
/usr/local/go/src/runtime/proc.go:435 +0xdc fp=0x1400004cf40 sp=0x1400004cf10 pc=0x10414214c
runtime.goparkunlock(0x1046dd920?, 0x0?, 0x0?, 0x0?)
/usr/local/go/src/runtime/proc.go:441 +0x34 fp=0x1400004cf70 sp=0x1400004cf40 pc=0x104111034
runtime.bgsweep(0x14000090000)
/usr/local/go/src/runtime/mgcsweep.go:276 +0x9c fp=0x1400004cfb0 sp=0x1400004cf70 pc=0x1040f938c
runtime.gcenable.gowrap1()
/usr/local/go/src/runtime/mgc.go:204 +0x28 fp=0x1400004cfd0 sp=0x1400004cfb0 pc=0x1040edc28
runtime.goexit({})
/usr/local/go/src/runtime/asm_arm64.s:1223 +0x4 fp=0x1400004cfd0 sp=0x1400004cfd0 pc=0x104149434
created by runtime.gcenable in goroutine 1
/usr/local/go/src/runtime/mgc.go:204 +0x6c

goroutine 19 gp=0x14000082700 m=nil [GC scavenge wait]:
runtime.gopark(0x1044f7d50, 0x1046e6320, 0xd, 0xa, 0x2)
/usr/local/go/src/runtime/proc.go:435 +0xdc fp=0x1400004d720 sp=0x1400004d6f0 pc=0x10414214c
runtime.goparkunlock(0x1046e6320?, 0x70?, 0xc4?, 0x1?)
/usr/local/go/src/runtime/proc.go:441 +0x34 fp=0x1400004d750 sp=0x1400004d720 pc=0x104111034
runtime.(*scavengerState).park(0x1046e6320)
/usr/local/go/src/runtime/mgcscavenge.go:425 +0x4c fp=0x1400004d780 sp=0x1400004d750 pc=0x1040f6b1c
runtime.bgscavenge(0x14000090000)
/usr/local/go/src/runtime/mgcscavenge.go:653 +0x44 fp=0x1400004d7b0 sp=0x1400004d780 pc=0x1040f7054
runtime.gcenable.gowrap2()
/usr/local/go/src/runtime/mgc.go:205 +0x28 fp=0x1400004d7d0 sp=0x1400004d7b0 pc=0x1040edbc8
runtime.goexit({})
/usr/local/go/src/runtime/asm_arm64.s:1223 +0x4 fp=0x1400004d7d0 sp=0x1400004d7d0 pc=0x104149434
created by runtime.gcenable in goroutine 1
/usr/local/go/src/runtime/mgc.go:205 +0xac

goroutine 2 gp=0x14000002e00 m=nil [finalizer wait]:
runtime.gopark(0x1044f7aa0, 0x10470cdf0, 0x10, 0xa, 0x1)
/usr/local/go/src/runtime/proc.go:435 +0xdc fp=0x14000050590 sp=0x14000050560 pc=0x10414214c
runtime.runfinq()
/usr/local/go/src/runtime/mfinal.go:196 +0xf0 fp=0x140000507d0 sp=0x14000050590 pc=0x1040ecd10
runtime.goexit({})
/usr/local/go/src/runtime/asm_arm64.s:1223 +0x4 fp=0x140000507d0 sp=0x140000507d0 pc=0x104149434
created by runtime.createfing in goroutine 1
/usr/local/go/src/runtime/mfinal.go:166 +0x4c

goroutine 3 gp=0x14000002fc0 m=nil [chan receive]:
runtime.gopark(0x1044f7a48, 0x14000072140, 0xe, 0x7, 0x2)
/usr/local/go/src/runtime/proc.go:435 +0xdc fp=0x14000050ee0 sp=0x14000050eb0 pc=0x10414214c
runtime.chanrecv(0x140000720e0, 0x0, 0x1)
/usr/local/go/src/runtime/chan.go:664 +0x2b4 fp=0x14000050f60 sp=0x14000050ee0 pc=0x1040dea24
runtime.chanrecv1(0x0?, 0x0?)
/usr/local/go/src/runtime/chan.go:506 +0x14 fp=0x14000050f90 sp=0x14000050f60 pc=0x1040de764
runtime.unique_runtime_registerUniqueMapCleanup.func2(0x1044f95e8)
/usr/local/go/src/runtime/mgc.go:1796 +0x2c fp=0x14000050fb0 sp=0x14000050f90 pc=0x10413deec
runtime.unique_runtime_registerUniqueMapCleanup.gowrap1()
/usr/local/go/src/runtime/mgc.go:1799 +0x30 fp=0x14000050fd0 sp=0x14000050fb0 pc=0x1040f0570
runtime.goexit({})
/usr/local/go/src/runtime/asm_arm64.s:1223 +0x4 fp=0x14000050fd0 sp=0x14000050fd0 pc=0x104149434
created by unique.runtime_registerUniqueMapCleanup in goroutine 1
/usr/local/go/src/runtime/mgc.go:1794 +0x78
exit status 2
FAIL nova/unittest/example/convery_mock 0.208s

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions