mock_test.go 36 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352
  1. package mock
  2. import (
  3. "errors"
  4. "fmt"
  5. "sync"
  6. "testing"
  7. "time"
  8. "github.com/stretchr/testify/assert"
  9. "github.com/stretchr/testify/require"
  10. )
  11. /*
  12. Test objects
  13. */
  14. // ExampleInterface represents an example interface.
  15. type ExampleInterface interface {
  16. TheExampleMethod(a, b, c int) (int, error)
  17. }
  18. // TestExampleImplementation is a test implementation of ExampleInterface
  19. type TestExampleImplementation struct {
  20. Mock
  21. }
  22. func (i *TestExampleImplementation) TheExampleMethod(a, b, c int) (int, error) {
  23. args := i.Called(a, b, c)
  24. return args.Int(0), errors.New("Whoops")
  25. }
  26. func (i *TestExampleImplementation) TheExampleMethod2(yesorno bool) {
  27. i.Called(yesorno)
  28. }
  29. type ExampleType struct {
  30. ran bool
  31. }
  32. func (i *TestExampleImplementation) TheExampleMethod3(et *ExampleType) error {
  33. args := i.Called(et)
  34. return args.Error(0)
  35. }
  36. func (i *TestExampleImplementation) TheExampleMethod4(v ExampleInterface) error {
  37. args := i.Called(v)
  38. return args.Error(0)
  39. }
  40. func (i *TestExampleImplementation) TheExampleMethod5(ch chan struct{}) error {
  41. args := i.Called(ch)
  42. return args.Error(0)
  43. }
  44. func (i *TestExampleImplementation) TheExampleMethod6(m map[string]bool) error {
  45. args := i.Called(m)
  46. return args.Error(0)
  47. }
  48. func (i *TestExampleImplementation) TheExampleMethod7(slice []bool) error {
  49. args := i.Called(slice)
  50. return args.Error(0)
  51. }
  52. func (i *TestExampleImplementation) TheExampleMethodFunc(fn func(string) error) error {
  53. args := i.Called(fn)
  54. return args.Error(0)
  55. }
  56. func (i *TestExampleImplementation) TheExampleMethodVariadic(a ...int) error {
  57. args := i.Called(a)
  58. return args.Error(0)
  59. }
  60. func (i *TestExampleImplementation) TheExampleMethodVariadicInterface(a ...interface{}) error {
  61. args := i.Called(a)
  62. return args.Error(0)
  63. }
  64. func (i *TestExampleImplementation) TheExampleMethodMixedVariadic(a int, b ...int) error {
  65. args := i.Called(a, b)
  66. return args.Error(0)
  67. }
  68. type ExampleFuncType func(string) error
  69. func (i *TestExampleImplementation) TheExampleMethodFuncType(fn ExampleFuncType) error {
  70. args := i.Called(fn)
  71. return args.Error(0)
  72. }
  73. /*
  74. Mock
  75. */
  76. func Test_Mock_TestData(t *testing.T) {
  77. var mockedService = new(TestExampleImplementation)
  78. if assert.NotNil(t, mockedService.TestData()) {
  79. mockedService.TestData().Set("something", 123)
  80. assert.Equal(t, 123, mockedService.TestData().Get("something").Data())
  81. }
  82. }
  83. func Test_Mock_On(t *testing.T) {
  84. // make a test impl object
  85. var mockedService = new(TestExampleImplementation)
  86. c := mockedService.On("TheExampleMethod")
  87. assert.Equal(t, []*Call{c}, mockedService.ExpectedCalls)
  88. assert.Equal(t, "TheExampleMethod", c.Method)
  89. }
  90. func Test_Mock_Chained_On(t *testing.T) {
  91. // make a test impl object
  92. var mockedService = new(TestExampleImplementation)
  93. mockedService.
  94. On("TheExampleMethod", 1, 2, 3).
  95. Return(0).
  96. On("TheExampleMethod3", AnythingOfType("*mock.ExampleType")).
  97. Return(nil)
  98. expectedCalls := []*Call{
  99. {
  100. Parent: &mockedService.Mock,
  101. Method: "TheExampleMethod",
  102. Arguments: []interface{}{1, 2, 3},
  103. ReturnArguments: []interface{}{0},
  104. },
  105. {
  106. Parent: &mockedService.Mock,
  107. Method: "TheExampleMethod3",
  108. Arguments: []interface{}{AnythingOfType("*mock.ExampleType")},
  109. ReturnArguments: []interface{}{nil},
  110. },
  111. }
  112. assert.Equal(t, expectedCalls, mockedService.ExpectedCalls)
  113. }
  114. func Test_Mock_On_WithArgs(t *testing.T) {
  115. // make a test impl object
  116. var mockedService = new(TestExampleImplementation)
  117. c := mockedService.On("TheExampleMethod", 1, 2, 3, 4)
  118. assert.Equal(t, []*Call{c}, mockedService.ExpectedCalls)
  119. assert.Equal(t, "TheExampleMethod", c.Method)
  120. assert.Equal(t, Arguments{1, 2, 3, 4}, c.Arguments)
  121. }
  122. func Test_Mock_On_WithFuncArg(t *testing.T) {
  123. // make a test impl object
  124. var mockedService = new(TestExampleImplementation)
  125. c := mockedService.
  126. On("TheExampleMethodFunc", AnythingOfType("func(string) error")).
  127. Return(nil)
  128. assert.Equal(t, []*Call{c}, mockedService.ExpectedCalls)
  129. assert.Equal(t, "TheExampleMethodFunc", c.Method)
  130. assert.Equal(t, 1, len(c.Arguments))
  131. assert.Equal(t, AnythingOfType("func(string) error"), c.Arguments[0])
  132. fn := func(string) error { return nil }
  133. assert.NotPanics(t, func() {
  134. mockedService.TheExampleMethodFunc(fn)
  135. })
  136. }
  137. func Test_Mock_On_WithIntArgMatcher(t *testing.T) {
  138. var mockedService TestExampleImplementation
  139. mockedService.On("TheExampleMethod",
  140. MatchedBy(func(a int) bool {
  141. return a == 1
  142. }), MatchedBy(func(b int) bool {
  143. return b == 2
  144. }), MatchedBy(func(c int) bool {
  145. return c == 3
  146. })).Return(0, nil)
  147. assert.Panics(t, func() {
  148. mockedService.TheExampleMethod(1, 2, 4)
  149. })
  150. assert.Panics(t, func() {
  151. mockedService.TheExampleMethod(2, 2, 3)
  152. })
  153. assert.NotPanics(t, func() {
  154. mockedService.TheExampleMethod(1, 2, 3)
  155. })
  156. }
  157. func Test_Mock_On_WithPtrArgMatcher(t *testing.T) {
  158. var mockedService TestExampleImplementation
  159. mockedService.On("TheExampleMethod3",
  160. MatchedBy(func(a *ExampleType) bool { return a != nil && a.ran == true }),
  161. ).Return(nil)
  162. mockedService.On("TheExampleMethod3",
  163. MatchedBy(func(a *ExampleType) bool { return a != nil && a.ran == false }),
  164. ).Return(errors.New("error"))
  165. mockedService.On("TheExampleMethod3",
  166. MatchedBy(func(a *ExampleType) bool { return a == nil }),
  167. ).Return(errors.New("error2"))
  168. assert.Equal(t, mockedService.TheExampleMethod3(&ExampleType{true}), nil)
  169. assert.EqualError(t, mockedService.TheExampleMethod3(&ExampleType{false}), "error")
  170. assert.EqualError(t, mockedService.TheExampleMethod3(nil), "error2")
  171. }
  172. func Test_Mock_On_WithFuncArgMatcher(t *testing.T) {
  173. var mockedService TestExampleImplementation
  174. fixture1, fixture2 := errors.New("fixture1"), errors.New("fixture2")
  175. mockedService.On("TheExampleMethodFunc",
  176. MatchedBy(func(a func(string) error) bool { return a != nil && a("string") == fixture1 }),
  177. ).Return(errors.New("fixture1"))
  178. mockedService.On("TheExampleMethodFunc",
  179. MatchedBy(func(a func(string) error) bool { return a != nil && a("string") == fixture2 }),
  180. ).Return(errors.New("fixture2"))
  181. mockedService.On("TheExampleMethodFunc",
  182. MatchedBy(func(a func(string) error) bool { return a == nil }),
  183. ).Return(errors.New("fixture3"))
  184. assert.EqualError(t, mockedService.TheExampleMethodFunc(
  185. func(string) error { return fixture1 }), "fixture1")
  186. assert.EqualError(t, mockedService.TheExampleMethodFunc(
  187. func(string) error { return fixture2 }), "fixture2")
  188. assert.EqualError(t, mockedService.TheExampleMethodFunc(nil), "fixture3")
  189. }
  190. func Test_Mock_On_WithInterfaceArgMatcher(t *testing.T) {
  191. var mockedService TestExampleImplementation
  192. mockedService.On("TheExampleMethod4",
  193. MatchedBy(func(a ExampleInterface) bool { return a == nil }),
  194. ).Return(errors.New("fixture1"))
  195. assert.EqualError(t, mockedService.TheExampleMethod4(nil), "fixture1")
  196. }
  197. func Test_Mock_On_WithChannelArgMatcher(t *testing.T) {
  198. var mockedService TestExampleImplementation
  199. mockedService.On("TheExampleMethod5",
  200. MatchedBy(func(ch chan struct{}) bool { return ch == nil }),
  201. ).Return(errors.New("fixture1"))
  202. assert.EqualError(t, mockedService.TheExampleMethod5(nil), "fixture1")
  203. }
  204. func Test_Mock_On_WithMapArgMatcher(t *testing.T) {
  205. var mockedService TestExampleImplementation
  206. mockedService.On("TheExampleMethod6",
  207. MatchedBy(func(m map[string]bool) bool { return m == nil }),
  208. ).Return(errors.New("fixture1"))
  209. assert.EqualError(t, mockedService.TheExampleMethod6(nil), "fixture1")
  210. }
  211. func Test_Mock_On_WithSliceArgMatcher(t *testing.T) {
  212. var mockedService TestExampleImplementation
  213. mockedService.On("TheExampleMethod7",
  214. MatchedBy(func(slice []bool) bool { return slice == nil }),
  215. ).Return(errors.New("fixture1"))
  216. assert.EqualError(t, mockedService.TheExampleMethod7(nil), "fixture1")
  217. }
  218. func Test_Mock_On_WithVariadicFunc(t *testing.T) {
  219. // make a test impl object
  220. var mockedService = new(TestExampleImplementation)
  221. c := mockedService.
  222. On("TheExampleMethodVariadic", []int{1, 2, 3}).
  223. Return(nil)
  224. assert.Equal(t, []*Call{c}, mockedService.ExpectedCalls)
  225. assert.Equal(t, 1, len(c.Arguments))
  226. assert.Equal(t, []int{1, 2, 3}, c.Arguments[0])
  227. assert.NotPanics(t, func() {
  228. mockedService.TheExampleMethodVariadic(1, 2, 3)
  229. })
  230. assert.Panics(t, func() {
  231. mockedService.TheExampleMethodVariadic(1, 2)
  232. })
  233. }
  234. func Test_Mock_On_WithMixedVariadicFunc(t *testing.T) {
  235. // make a test impl object
  236. var mockedService = new(TestExampleImplementation)
  237. c := mockedService.
  238. On("TheExampleMethodMixedVariadic", 1, []int{2, 3, 4}).
  239. Return(nil)
  240. assert.Equal(t, []*Call{c}, mockedService.ExpectedCalls)
  241. assert.Equal(t, 2, len(c.Arguments))
  242. assert.Equal(t, 1, c.Arguments[0])
  243. assert.Equal(t, []int{2, 3, 4}, c.Arguments[1])
  244. assert.NotPanics(t, func() {
  245. mockedService.TheExampleMethodMixedVariadic(1, 2, 3, 4)
  246. })
  247. assert.Panics(t, func() {
  248. mockedService.TheExampleMethodMixedVariadic(1, 2, 3, 5)
  249. })
  250. }
  251. func Test_Mock_On_WithVariadicFuncWithInterface(t *testing.T) {
  252. // make a test impl object
  253. var mockedService = new(TestExampleImplementation)
  254. c := mockedService.On("TheExampleMethodVariadicInterface", []interface{}{1, 2, 3}).
  255. Return(nil)
  256. assert.Equal(t, []*Call{c}, mockedService.ExpectedCalls)
  257. assert.Equal(t, 1, len(c.Arguments))
  258. assert.Equal(t, []interface{}{1, 2, 3}, c.Arguments[0])
  259. assert.NotPanics(t, func() {
  260. mockedService.TheExampleMethodVariadicInterface(1, 2, 3)
  261. })
  262. assert.Panics(t, func() {
  263. mockedService.TheExampleMethodVariadicInterface(1, 2)
  264. })
  265. }
  266. func Test_Mock_On_WithVariadicFuncWithEmptyInterfaceArray(t *testing.T) {
  267. // make a test impl object
  268. var mockedService = new(TestExampleImplementation)
  269. var expected []interface{}
  270. c := mockedService.
  271. On("TheExampleMethodVariadicInterface", expected).
  272. Return(nil)
  273. assert.Equal(t, []*Call{c}, mockedService.ExpectedCalls)
  274. assert.Equal(t, 1, len(c.Arguments))
  275. assert.Equal(t, expected, c.Arguments[0])
  276. assert.NotPanics(t, func() {
  277. mockedService.TheExampleMethodVariadicInterface()
  278. })
  279. assert.Panics(t, func() {
  280. mockedService.TheExampleMethodVariadicInterface(1, 2)
  281. })
  282. }
  283. func Test_Mock_On_WithFuncPanics(t *testing.T) {
  284. // make a test impl object
  285. var mockedService = new(TestExampleImplementation)
  286. assert.Panics(t, func() {
  287. mockedService.On("TheExampleMethodFunc", func(string) error { return nil })
  288. })
  289. }
  290. func Test_Mock_On_WithFuncTypeArg(t *testing.T) {
  291. // make a test impl object
  292. var mockedService = new(TestExampleImplementation)
  293. c := mockedService.
  294. On("TheExampleMethodFuncType", AnythingOfType("mock.ExampleFuncType")).
  295. Return(nil)
  296. assert.Equal(t, []*Call{c}, mockedService.ExpectedCalls)
  297. assert.Equal(t, 1, len(c.Arguments))
  298. assert.Equal(t, AnythingOfType("mock.ExampleFuncType"), c.Arguments[0])
  299. fn := func(string) error { return nil }
  300. assert.NotPanics(t, func() {
  301. mockedService.TheExampleMethodFuncType(fn)
  302. })
  303. }
  304. func Test_Mock_Return(t *testing.T) {
  305. // make a test impl object
  306. var mockedService = new(TestExampleImplementation)
  307. c := mockedService.
  308. On("TheExampleMethod", "A", "B", true).
  309. Return(1, "two", true)
  310. require.Equal(t, []*Call{c}, mockedService.ExpectedCalls)
  311. call := mockedService.ExpectedCalls[0]
  312. assert.Equal(t, "TheExampleMethod", call.Method)
  313. assert.Equal(t, "A", call.Arguments[0])
  314. assert.Equal(t, "B", call.Arguments[1])
  315. assert.Equal(t, true, call.Arguments[2])
  316. assert.Equal(t, 1, call.ReturnArguments[0])
  317. assert.Equal(t, "two", call.ReturnArguments[1])
  318. assert.Equal(t, true, call.ReturnArguments[2])
  319. assert.Equal(t, 0, call.Repeatability)
  320. assert.Nil(t, call.WaitFor)
  321. }
  322. func Test_Mock_Return_WaitUntil(t *testing.T) {
  323. // make a test impl object
  324. var mockedService = new(TestExampleImplementation)
  325. ch := time.After(time.Second)
  326. c := mockedService.Mock.
  327. On("TheExampleMethod", "A", "B", true).
  328. WaitUntil(ch).
  329. Return(1, "two", true)
  330. // assert that the call was created
  331. require.Equal(t, []*Call{c}, mockedService.ExpectedCalls)
  332. call := mockedService.ExpectedCalls[0]
  333. assert.Equal(t, "TheExampleMethod", call.Method)
  334. assert.Equal(t, "A", call.Arguments[0])
  335. assert.Equal(t, "B", call.Arguments[1])
  336. assert.Equal(t, true, call.Arguments[2])
  337. assert.Equal(t, 1, call.ReturnArguments[0])
  338. assert.Equal(t, "two", call.ReturnArguments[1])
  339. assert.Equal(t, true, call.ReturnArguments[2])
  340. assert.Equal(t, 0, call.Repeatability)
  341. assert.Equal(t, ch, call.WaitFor)
  342. }
  343. func Test_Mock_Return_After(t *testing.T) {
  344. // make a test impl object
  345. var mockedService = new(TestExampleImplementation)
  346. c := mockedService.Mock.
  347. On("TheExampleMethod", "A", "B", true).
  348. Return(1, "two", true).
  349. After(time.Second)
  350. require.Equal(t, []*Call{c}, mockedService.ExpectedCalls)
  351. call := mockedService.Mock.ExpectedCalls[0]
  352. assert.Equal(t, "TheExampleMethod", call.Method)
  353. assert.Equal(t, "A", call.Arguments[0])
  354. assert.Equal(t, "B", call.Arguments[1])
  355. assert.Equal(t, true, call.Arguments[2])
  356. assert.Equal(t, 1, call.ReturnArguments[0])
  357. assert.Equal(t, "two", call.ReturnArguments[1])
  358. assert.Equal(t, true, call.ReturnArguments[2])
  359. assert.Equal(t, 0, call.Repeatability)
  360. assert.NotEqual(t, nil, call.WaitFor)
  361. }
  362. func Test_Mock_Return_Run(t *testing.T) {
  363. // make a test impl object
  364. var mockedService = new(TestExampleImplementation)
  365. fn := func(args Arguments) {
  366. arg := args.Get(0).(*ExampleType)
  367. arg.ran = true
  368. }
  369. c := mockedService.Mock.
  370. On("TheExampleMethod3", AnythingOfType("*mock.ExampleType")).
  371. Return(nil).
  372. Run(fn)
  373. require.Equal(t, []*Call{c}, mockedService.ExpectedCalls)
  374. call := mockedService.Mock.ExpectedCalls[0]
  375. assert.Equal(t, "TheExampleMethod3", call.Method)
  376. assert.Equal(t, AnythingOfType("*mock.ExampleType"), call.Arguments[0])
  377. assert.Equal(t, nil, call.ReturnArguments[0])
  378. assert.Equal(t, 0, call.Repeatability)
  379. assert.NotEqual(t, nil, call.WaitFor)
  380. assert.NotNil(t, call.Run)
  381. et := ExampleType{}
  382. assert.Equal(t, false, et.ran)
  383. mockedService.TheExampleMethod3(&et)
  384. assert.Equal(t, true, et.ran)
  385. }
  386. func Test_Mock_Return_Run_Out_Of_Order(t *testing.T) {
  387. // make a test impl object
  388. var mockedService = new(TestExampleImplementation)
  389. f := func(args Arguments) {
  390. arg := args.Get(0).(*ExampleType)
  391. arg.ran = true
  392. }
  393. c := mockedService.Mock.
  394. On("TheExampleMethod3", AnythingOfType("*mock.ExampleType")).
  395. Run(f).
  396. Return(nil)
  397. require.Equal(t, []*Call{c}, mockedService.ExpectedCalls)
  398. call := mockedService.Mock.ExpectedCalls[0]
  399. assert.Equal(t, "TheExampleMethod3", call.Method)
  400. assert.Equal(t, AnythingOfType("*mock.ExampleType"), call.Arguments[0])
  401. assert.Equal(t, nil, call.ReturnArguments[0])
  402. assert.Equal(t, 0, call.Repeatability)
  403. assert.NotEqual(t, nil, call.WaitFor)
  404. assert.NotNil(t, call.Run)
  405. }
  406. func Test_Mock_Return_Once(t *testing.T) {
  407. // make a test impl object
  408. var mockedService = new(TestExampleImplementation)
  409. c := mockedService.On("TheExampleMethod", "A", "B", true).
  410. Return(1, "two", true).
  411. Once()
  412. require.Equal(t, []*Call{c}, mockedService.ExpectedCalls)
  413. call := mockedService.ExpectedCalls[0]
  414. assert.Equal(t, "TheExampleMethod", call.Method)
  415. assert.Equal(t, "A", call.Arguments[0])
  416. assert.Equal(t, "B", call.Arguments[1])
  417. assert.Equal(t, true, call.Arguments[2])
  418. assert.Equal(t, 1, call.ReturnArguments[0])
  419. assert.Equal(t, "two", call.ReturnArguments[1])
  420. assert.Equal(t, true, call.ReturnArguments[2])
  421. assert.Equal(t, 1, call.Repeatability)
  422. assert.Nil(t, call.WaitFor)
  423. }
  424. func Test_Mock_Return_Twice(t *testing.T) {
  425. // make a test impl object
  426. var mockedService = new(TestExampleImplementation)
  427. c := mockedService.
  428. On("TheExampleMethod", "A", "B", true).
  429. Return(1, "two", true).
  430. Twice()
  431. require.Equal(t, []*Call{c}, mockedService.ExpectedCalls)
  432. call := mockedService.ExpectedCalls[0]
  433. assert.Equal(t, "TheExampleMethod", call.Method)
  434. assert.Equal(t, "A", call.Arguments[0])
  435. assert.Equal(t, "B", call.Arguments[1])
  436. assert.Equal(t, true, call.Arguments[2])
  437. assert.Equal(t, 1, call.ReturnArguments[0])
  438. assert.Equal(t, "two", call.ReturnArguments[1])
  439. assert.Equal(t, true, call.ReturnArguments[2])
  440. assert.Equal(t, 2, call.Repeatability)
  441. assert.Nil(t, call.WaitFor)
  442. }
  443. func Test_Mock_Return_Times(t *testing.T) {
  444. // make a test impl object
  445. var mockedService = new(TestExampleImplementation)
  446. c := mockedService.
  447. On("TheExampleMethod", "A", "B", true).
  448. Return(1, "two", true).
  449. Times(5)
  450. require.Equal(t, []*Call{c}, mockedService.ExpectedCalls)
  451. call := mockedService.ExpectedCalls[0]
  452. assert.Equal(t, "TheExampleMethod", call.Method)
  453. assert.Equal(t, "A", call.Arguments[0])
  454. assert.Equal(t, "B", call.Arguments[1])
  455. assert.Equal(t, true, call.Arguments[2])
  456. assert.Equal(t, 1, call.ReturnArguments[0])
  457. assert.Equal(t, "two", call.ReturnArguments[1])
  458. assert.Equal(t, true, call.ReturnArguments[2])
  459. assert.Equal(t, 5, call.Repeatability)
  460. assert.Nil(t, call.WaitFor)
  461. }
  462. func Test_Mock_Return_Nothing(t *testing.T) {
  463. // make a test impl object
  464. var mockedService = new(TestExampleImplementation)
  465. c := mockedService.
  466. On("TheExampleMethod", "A", "B", true).
  467. Return()
  468. require.Equal(t, []*Call{c}, mockedService.ExpectedCalls)
  469. call := mockedService.ExpectedCalls[0]
  470. assert.Equal(t, "TheExampleMethod", call.Method)
  471. assert.Equal(t, "A", call.Arguments[0])
  472. assert.Equal(t, "B", call.Arguments[1])
  473. assert.Equal(t, true, call.Arguments[2])
  474. assert.Equal(t, 0, len(call.ReturnArguments))
  475. }
  476. func Test_Mock_findExpectedCall(t *testing.T) {
  477. m := new(Mock)
  478. m.On("One", 1).Return("one")
  479. m.On("Two", 2).Return("two")
  480. m.On("Two", 3).Return("three")
  481. f, c := m.findExpectedCall("Two", 3)
  482. if assert.Equal(t, 2, f) {
  483. if assert.NotNil(t, c) {
  484. assert.Equal(t, "Two", c.Method)
  485. assert.Equal(t, 3, c.Arguments[0])
  486. assert.Equal(t, "three", c.ReturnArguments[0])
  487. }
  488. }
  489. }
  490. func Test_Mock_findExpectedCall_For_Unknown_Method(t *testing.T) {
  491. m := new(Mock)
  492. m.On("One", 1).Return("one")
  493. m.On("Two", 2).Return("two")
  494. m.On("Two", 3).Return("three")
  495. f, _ := m.findExpectedCall("Two")
  496. assert.Equal(t, -1, f)
  497. }
  498. func Test_Mock_findExpectedCall_Respects_Repeatability(t *testing.T) {
  499. m := new(Mock)
  500. m.On("One", 1).Return("one")
  501. m.On("Two", 2).Return("two").Once()
  502. m.On("Two", 3).Return("three").Twice()
  503. m.On("Two", 3).Return("three").Times(8)
  504. f, c := m.findExpectedCall("Two", 3)
  505. if assert.Equal(t, 2, f) {
  506. if assert.NotNil(t, c) {
  507. assert.Equal(t, "Two", c.Method)
  508. assert.Equal(t, 3, c.Arguments[0])
  509. assert.Equal(t, "three", c.ReturnArguments[0])
  510. }
  511. }
  512. }
  513. func Test_callString(t *testing.T) {
  514. assert.Equal(t, `Method(int,bool,string)`, callString("Method", []interface{}{1, true, "something"}, false))
  515. }
  516. func Test_Mock_Called(t *testing.T) {
  517. var mockedService = new(TestExampleImplementation)
  518. mockedService.On("Test_Mock_Called", 1, 2, 3).Return(5, "6", true)
  519. returnArguments := mockedService.Called(1, 2, 3)
  520. if assert.Equal(t, 1, len(mockedService.Calls)) {
  521. assert.Equal(t, "Test_Mock_Called", mockedService.Calls[0].Method)
  522. assert.Equal(t, 1, mockedService.Calls[0].Arguments[0])
  523. assert.Equal(t, 2, mockedService.Calls[0].Arguments[1])
  524. assert.Equal(t, 3, mockedService.Calls[0].Arguments[2])
  525. }
  526. if assert.Equal(t, 3, len(returnArguments)) {
  527. assert.Equal(t, 5, returnArguments[0])
  528. assert.Equal(t, "6", returnArguments[1])
  529. assert.Equal(t, true, returnArguments[2])
  530. }
  531. }
  532. func asyncCall(m *Mock, ch chan Arguments) {
  533. ch <- m.Called(1, 2, 3)
  534. }
  535. func Test_Mock_Called_blocks(t *testing.T) {
  536. var mockedService = new(TestExampleImplementation)
  537. mockedService.Mock.On("asyncCall", 1, 2, 3).Return(5, "6", true).After(2 * time.Millisecond)
  538. ch := make(chan Arguments)
  539. go asyncCall(&mockedService.Mock, ch)
  540. select {
  541. case <-ch:
  542. t.Fatal("should have waited")
  543. case <-time.After(1 * time.Millisecond):
  544. }
  545. returnArguments := <-ch
  546. if assert.Equal(t, 1, len(mockedService.Mock.Calls)) {
  547. assert.Equal(t, "asyncCall", mockedService.Mock.Calls[0].Method)
  548. assert.Equal(t, 1, mockedService.Mock.Calls[0].Arguments[0])
  549. assert.Equal(t, 2, mockedService.Mock.Calls[0].Arguments[1])
  550. assert.Equal(t, 3, mockedService.Mock.Calls[0].Arguments[2])
  551. }
  552. if assert.Equal(t, 3, len(returnArguments)) {
  553. assert.Equal(t, 5, returnArguments[0])
  554. assert.Equal(t, "6", returnArguments[1])
  555. assert.Equal(t, true, returnArguments[2])
  556. }
  557. }
  558. func Test_Mock_Called_For_Bounded_Repeatability(t *testing.T) {
  559. var mockedService = new(TestExampleImplementation)
  560. mockedService.
  561. On("Test_Mock_Called_For_Bounded_Repeatability", 1, 2, 3).
  562. Return(5, "6", true).
  563. Once()
  564. mockedService.
  565. On("Test_Mock_Called_For_Bounded_Repeatability", 1, 2, 3).
  566. Return(-1, "hi", false)
  567. returnArguments1 := mockedService.Called(1, 2, 3)
  568. returnArguments2 := mockedService.Called(1, 2, 3)
  569. if assert.Equal(t, 2, len(mockedService.Calls)) {
  570. assert.Equal(t, "Test_Mock_Called_For_Bounded_Repeatability", mockedService.Calls[0].Method)
  571. assert.Equal(t, 1, mockedService.Calls[0].Arguments[0])
  572. assert.Equal(t, 2, mockedService.Calls[0].Arguments[1])
  573. assert.Equal(t, 3, mockedService.Calls[0].Arguments[2])
  574. assert.Equal(t, "Test_Mock_Called_For_Bounded_Repeatability", mockedService.Calls[1].Method)
  575. assert.Equal(t, 1, mockedService.Calls[1].Arguments[0])
  576. assert.Equal(t, 2, mockedService.Calls[1].Arguments[1])
  577. assert.Equal(t, 3, mockedService.Calls[1].Arguments[2])
  578. }
  579. if assert.Equal(t, 3, len(returnArguments1)) {
  580. assert.Equal(t, 5, returnArguments1[0])
  581. assert.Equal(t, "6", returnArguments1[1])
  582. assert.Equal(t, true, returnArguments1[2])
  583. }
  584. if assert.Equal(t, 3, len(returnArguments2)) {
  585. assert.Equal(t, -1, returnArguments2[0])
  586. assert.Equal(t, "hi", returnArguments2[1])
  587. assert.Equal(t, false, returnArguments2[2])
  588. }
  589. }
  590. func Test_Mock_Called_For_SetTime_Expectation(t *testing.T) {
  591. var mockedService = new(TestExampleImplementation)
  592. mockedService.On("TheExampleMethod", 1, 2, 3).Return(5, "6", true).Times(4)
  593. mockedService.TheExampleMethod(1, 2, 3)
  594. mockedService.TheExampleMethod(1, 2, 3)
  595. mockedService.TheExampleMethod(1, 2, 3)
  596. mockedService.TheExampleMethod(1, 2, 3)
  597. assert.Panics(t, func() {
  598. mockedService.TheExampleMethod(1, 2, 3)
  599. })
  600. }
  601. func Test_Mock_Called_Unexpected(t *testing.T) {
  602. var mockedService = new(TestExampleImplementation)
  603. // make sure it panics if no expectation was made
  604. assert.Panics(t, func() {
  605. mockedService.Called(1, 2, 3)
  606. }, "Calling unexpected method should panic")
  607. }
  608. func Test_AssertExpectationsForObjects_Helper(t *testing.T) {
  609. var mockedService1 = new(TestExampleImplementation)
  610. var mockedService2 = new(TestExampleImplementation)
  611. var mockedService3 = new(TestExampleImplementation)
  612. mockedService1.On("Test_AssertExpectationsForObjects_Helper", 1).Return()
  613. mockedService2.On("Test_AssertExpectationsForObjects_Helper", 2).Return()
  614. mockedService3.On("Test_AssertExpectationsForObjects_Helper", 3).Return()
  615. mockedService1.Called(1)
  616. mockedService2.Called(2)
  617. mockedService3.Called(3)
  618. assert.True(t, AssertExpectationsForObjects(t, &mockedService1.Mock, &mockedService2.Mock, &mockedService3.Mock))
  619. assert.True(t, AssertExpectationsForObjects(t, mockedService1, mockedService2, mockedService3))
  620. }
  621. func Test_AssertExpectationsForObjects_Helper_Failed(t *testing.T) {
  622. var mockedService1 = new(TestExampleImplementation)
  623. var mockedService2 = new(TestExampleImplementation)
  624. var mockedService3 = new(TestExampleImplementation)
  625. mockedService1.On("Test_AssertExpectationsForObjects_Helper_Failed", 1).Return()
  626. mockedService2.On("Test_AssertExpectationsForObjects_Helper_Failed", 2).Return()
  627. mockedService3.On("Test_AssertExpectationsForObjects_Helper_Failed", 3).Return()
  628. mockedService1.Called(1)
  629. mockedService3.Called(3)
  630. tt := new(testing.T)
  631. assert.False(t, AssertExpectationsForObjects(tt, &mockedService1.Mock, &mockedService2.Mock, &mockedService3.Mock))
  632. assert.False(t, AssertExpectationsForObjects(tt, mockedService1, mockedService2, mockedService3))
  633. }
  634. func Test_Mock_AssertExpectations(t *testing.T) {
  635. var mockedService = new(TestExampleImplementation)
  636. mockedService.On("Test_Mock_AssertExpectations", 1, 2, 3).Return(5, 6, 7)
  637. tt := new(testing.T)
  638. assert.False(t, mockedService.AssertExpectations(tt))
  639. // make the call now
  640. mockedService.Called(1, 2, 3)
  641. // now assert expectations
  642. assert.True(t, mockedService.AssertExpectations(tt))
  643. }
  644. func Test_Mock_AssertExpectations_Placeholder_NoArgs(t *testing.T) {
  645. var mockedService = new(TestExampleImplementation)
  646. mockedService.On("Test_Mock_AssertExpectations_Placeholder_NoArgs").Return(5, 6, 7).Once()
  647. mockedService.On("Test_Mock_AssertExpectations_Placeholder_NoArgs").Return(7, 6, 5)
  648. tt := new(testing.T)
  649. assert.False(t, mockedService.AssertExpectations(tt))
  650. // make the call now
  651. mockedService.Called()
  652. // now assert expectations
  653. assert.True(t, mockedService.AssertExpectations(tt))
  654. }
  655. func Test_Mock_AssertExpectations_Placeholder(t *testing.T) {
  656. var mockedService = new(TestExampleImplementation)
  657. mockedService.On("Test_Mock_AssertExpectations_Placeholder", 1, 2, 3).Return(5, 6, 7).Once()
  658. mockedService.On("Test_Mock_AssertExpectations_Placeholder", 3, 2, 1).Return(7, 6, 5)
  659. tt := new(testing.T)
  660. assert.False(t, mockedService.AssertExpectations(tt))
  661. // make the call now
  662. mockedService.Called(1, 2, 3)
  663. // now assert expectations
  664. assert.False(t, mockedService.AssertExpectations(tt))
  665. // make call to the second expectation
  666. mockedService.Called(3, 2, 1)
  667. // now assert expectations again
  668. assert.True(t, mockedService.AssertExpectations(tt))
  669. }
  670. func Test_Mock_AssertExpectations_With_Pointers(t *testing.T) {
  671. var mockedService = new(TestExampleImplementation)
  672. mockedService.On("Test_Mock_AssertExpectations_With_Pointers", &struct{ Foo int }{1}).Return(1)
  673. mockedService.On("Test_Mock_AssertExpectations_With_Pointers", &struct{ Foo int }{2}).Return(2)
  674. tt := new(testing.T)
  675. assert.False(t, mockedService.AssertExpectations(tt))
  676. s := struct{ Foo int }{1}
  677. // make the calls now
  678. mockedService.Called(&s)
  679. s.Foo = 2
  680. mockedService.Called(&s)
  681. // now assert expectations
  682. assert.True(t, mockedService.AssertExpectations(tt))
  683. }
  684. func Test_Mock_AssertExpectationsCustomType(t *testing.T) {
  685. var mockedService = new(TestExampleImplementation)
  686. mockedService.On("TheExampleMethod3", AnythingOfType("*mock.ExampleType")).Return(nil).Once()
  687. tt := new(testing.T)
  688. assert.False(t, mockedService.AssertExpectations(tt))
  689. // make the call now
  690. mockedService.TheExampleMethod3(&ExampleType{})
  691. // now assert expectations
  692. assert.True(t, mockedService.AssertExpectations(tt))
  693. }
  694. func Test_Mock_AssertExpectations_With_Repeatability(t *testing.T) {
  695. var mockedService = new(TestExampleImplementation)
  696. mockedService.On("Test_Mock_AssertExpectations_With_Repeatability", 1, 2, 3).Return(5, 6, 7).Twice()
  697. tt := new(testing.T)
  698. assert.False(t, mockedService.AssertExpectations(tt))
  699. // make the call now
  700. mockedService.Called(1, 2, 3)
  701. assert.False(t, mockedService.AssertExpectations(tt))
  702. mockedService.Called(1, 2, 3)
  703. // now assert expectations
  704. assert.True(t, mockedService.AssertExpectations(tt))
  705. }
  706. func Test_Mock_TwoCallsWithDifferentArguments(t *testing.T) {
  707. var mockedService = new(TestExampleImplementation)
  708. mockedService.On("Test_Mock_TwoCallsWithDifferentArguments", 1, 2, 3).Return(5, 6, 7)
  709. mockedService.On("Test_Mock_TwoCallsWithDifferentArguments", 4, 5, 6).Return(5, 6, 7)
  710. args1 := mockedService.Called(1, 2, 3)
  711. assert.Equal(t, 5, args1.Int(0))
  712. assert.Equal(t, 6, args1.Int(1))
  713. assert.Equal(t, 7, args1.Int(2))
  714. args2 := mockedService.Called(4, 5, 6)
  715. assert.Equal(t, 5, args2.Int(0))
  716. assert.Equal(t, 6, args2.Int(1))
  717. assert.Equal(t, 7, args2.Int(2))
  718. }
  719. func Test_Mock_AssertNumberOfCalls(t *testing.T) {
  720. var mockedService = new(TestExampleImplementation)
  721. mockedService.On("Test_Mock_AssertNumberOfCalls", 1, 2, 3).Return(5, 6, 7)
  722. mockedService.Called(1, 2, 3)
  723. assert.True(t, mockedService.AssertNumberOfCalls(t, "Test_Mock_AssertNumberOfCalls", 1))
  724. mockedService.Called(1, 2, 3)
  725. assert.True(t, mockedService.AssertNumberOfCalls(t, "Test_Mock_AssertNumberOfCalls", 2))
  726. }
  727. func Test_Mock_AssertCalled(t *testing.T) {
  728. var mockedService = new(TestExampleImplementation)
  729. mockedService.On("Test_Mock_AssertCalled", 1, 2, 3).Return(5, 6, 7)
  730. mockedService.Called(1, 2, 3)
  731. assert.True(t, mockedService.AssertCalled(t, "Test_Mock_AssertCalled", 1, 2, 3))
  732. }
  733. func Test_Mock_AssertCalled_WithAnythingOfTypeArgument(t *testing.T) {
  734. var mockedService = new(TestExampleImplementation)
  735. mockedService.
  736. On("Test_Mock_AssertCalled_WithAnythingOfTypeArgument", Anything, Anything, Anything).
  737. Return()
  738. mockedService.Called(1, "two", []uint8("three"))
  739. assert.True(t, mockedService.AssertCalled(t, "Test_Mock_AssertCalled_WithAnythingOfTypeArgument", AnythingOfType("int"), AnythingOfType("string"), AnythingOfType("[]uint8")))
  740. }
  741. func Test_Mock_AssertCalled_WithArguments(t *testing.T) {
  742. var mockedService = new(TestExampleImplementation)
  743. mockedService.On("Test_Mock_AssertCalled_WithArguments", 1, 2, 3).Return(5, 6, 7)
  744. mockedService.Called(1, 2, 3)
  745. tt := new(testing.T)
  746. assert.True(t, mockedService.AssertCalled(tt, "Test_Mock_AssertCalled_WithArguments", 1, 2, 3))
  747. assert.False(t, mockedService.AssertCalled(tt, "Test_Mock_AssertCalled_WithArguments", 2, 3, 4))
  748. }
  749. func Test_Mock_AssertCalled_WithArguments_With_Repeatability(t *testing.T) {
  750. var mockedService = new(TestExampleImplementation)
  751. mockedService.On("Test_Mock_AssertCalled_WithArguments_With_Repeatability", 1, 2, 3).Return(5, 6, 7).Once()
  752. mockedService.On("Test_Mock_AssertCalled_WithArguments_With_Repeatability", 2, 3, 4).Return(5, 6, 7).Once()
  753. mockedService.Called(1, 2, 3)
  754. mockedService.Called(2, 3, 4)
  755. tt := new(testing.T)
  756. assert.True(t, mockedService.AssertCalled(tt, "Test_Mock_AssertCalled_WithArguments_With_Repeatability", 1, 2, 3))
  757. assert.True(t, mockedService.AssertCalled(tt, "Test_Mock_AssertCalled_WithArguments_With_Repeatability", 2, 3, 4))
  758. assert.False(t, mockedService.AssertCalled(tt, "Test_Mock_AssertCalled_WithArguments_With_Repeatability", 3, 4, 5))
  759. }
  760. func Test_Mock_AssertNotCalled(t *testing.T) {
  761. var mockedService = new(TestExampleImplementation)
  762. mockedService.On("Test_Mock_AssertNotCalled", 1, 2, 3).Return(5, 6, 7)
  763. mockedService.Called(1, 2, 3)
  764. assert.True(t, mockedService.AssertNotCalled(t, "Test_Mock_NotCalled"))
  765. }
  766. func Test_Mock_AssertOptional(t *testing.T) {
  767. // Optional called
  768. var ms1 = new(TestExampleImplementation)
  769. ms1.On("TheExampleMethod", 1, 2, 3).Maybe().Return(4, nil)
  770. ms1.TheExampleMethod(1, 2, 3)
  771. tt1 := new(testing.T)
  772. assert.Equal(t, true, ms1.AssertExpectations(tt1))
  773. // Optional not called
  774. var ms2 = new(TestExampleImplementation)
  775. ms2.On("TheExampleMethod", 1, 2, 3).Maybe().Return(4, nil)
  776. tt2 := new(testing.T)
  777. assert.Equal(t, true, ms2.AssertExpectations(tt2))
  778. // Non-optional called
  779. var ms3 = new(TestExampleImplementation)
  780. ms3.On("TheExampleMethod", 1, 2, 3).Return(4, nil)
  781. ms3.TheExampleMethod(1, 2, 3)
  782. tt3 := new(testing.T)
  783. assert.Equal(t, true, ms3.AssertExpectations(tt3))
  784. }
  785. /*
  786. Arguments helper methods
  787. */
  788. func Test_Arguments_Get(t *testing.T) {
  789. var args = Arguments([]interface{}{"string", 123, true})
  790. assert.Equal(t, "string", args.Get(0).(string))
  791. assert.Equal(t, 123, args.Get(1).(int))
  792. assert.Equal(t, true, args.Get(2).(bool))
  793. }
  794. func Test_Arguments_Is(t *testing.T) {
  795. var args = Arguments([]interface{}{"string", 123, true})
  796. assert.True(t, args.Is("string", 123, true))
  797. assert.False(t, args.Is("wrong", 456, false))
  798. }
  799. func Test_Arguments_Diff(t *testing.T) {
  800. var args = Arguments([]interface{}{"Hello World", 123, true})
  801. var diff string
  802. var count int
  803. diff, count = args.Diff([]interface{}{"Hello World", 456, "false"})
  804. assert.Equal(t, 2, count)
  805. assert.Contains(t, diff, `%!s(int=456) != %!s(int=123)`)
  806. assert.Contains(t, diff, `false != %!s(bool=true)`)
  807. }
  808. func Test_Arguments_Diff_DifferentNumberOfArgs(t *testing.T) {
  809. var args = Arguments([]interface{}{"string", 123, true})
  810. var diff string
  811. var count int
  812. diff, count = args.Diff([]interface{}{"string", 456, "false", "extra"})
  813. assert.Equal(t, 3, count)
  814. assert.Contains(t, diff, `extra != (Missing)`)
  815. }
  816. func Test_Arguments_Diff_WithAnythingArgument(t *testing.T) {
  817. var args = Arguments([]interface{}{"string", 123, true})
  818. var count int
  819. _, count = args.Diff([]interface{}{"string", Anything, true})
  820. assert.Equal(t, 0, count)
  821. }
  822. func Test_Arguments_Diff_WithAnythingArgument_InActualToo(t *testing.T) {
  823. var args = Arguments([]interface{}{"string", Anything, true})
  824. var count int
  825. _, count = args.Diff([]interface{}{"string", 123, true})
  826. assert.Equal(t, 0, count)
  827. }
  828. func Test_Arguments_Diff_WithAnythingOfTypeArgument(t *testing.T) {
  829. var args = Arguments([]interface{}{"string", AnythingOfType("int"), true})
  830. var count int
  831. _, count = args.Diff([]interface{}{"string", 123, true})
  832. assert.Equal(t, 0, count)
  833. }
  834. func Test_Arguments_Diff_WithAnythingOfTypeArgument_Failing(t *testing.T) {
  835. var args = Arguments([]interface{}{"string", AnythingOfType("string"), true})
  836. var count int
  837. var diff string
  838. diff, count = args.Diff([]interface{}{"string", 123, true})
  839. assert.Equal(t, 1, count)
  840. assert.Contains(t, diff, `string != type int - %!s(int=123)`)
  841. }
  842. func Test_Arguments_Diff_WithArgMatcher(t *testing.T) {
  843. matchFn := func(a int) bool {
  844. return a == 123
  845. }
  846. var args = Arguments([]interface{}{"string", MatchedBy(matchFn), true})
  847. diff, count := args.Diff([]interface{}{"string", 124, true})
  848. assert.Equal(t, 1, count)
  849. assert.Contains(t, diff, `%!s(int=124) not matched by func(int) bool`)
  850. diff, count = args.Diff([]interface{}{"string", false, true})
  851. assert.Equal(t, 1, count)
  852. assert.Contains(t, diff, `%!s(bool=false) not matched by func(int) bool`)
  853. diff, count = args.Diff([]interface{}{"string", 123, false})
  854. assert.Contains(t, diff, `%!s(int=123) matched by func(int) bool`)
  855. diff, count = args.Diff([]interface{}{"string", 123, true})
  856. assert.Equal(t, 0, count)
  857. assert.Contains(t, diff, `No differences.`)
  858. }
  859. func Test_Arguments_Assert(t *testing.T) {
  860. var args = Arguments([]interface{}{"string", 123, true})
  861. assert.True(t, args.Assert(t, "string", 123, true))
  862. }
  863. func Test_Arguments_String_Representation(t *testing.T) {
  864. var args = Arguments([]interface{}{"string", 123, true})
  865. assert.Equal(t, `string,int,bool`, args.String())
  866. }
  867. func Test_Arguments_String(t *testing.T) {
  868. var args = Arguments([]interface{}{"string", 123, true})
  869. assert.Equal(t, "string", args.String(0))
  870. }
  871. func Test_Arguments_Error(t *testing.T) {
  872. var err = errors.New("An Error")
  873. var args = Arguments([]interface{}{"string", 123, true, err})
  874. assert.Equal(t, err, args.Error(3))
  875. }
  876. func Test_Arguments_Error_Nil(t *testing.T) {
  877. var args = Arguments([]interface{}{"string", 123, true, nil})
  878. assert.Equal(t, nil, args.Error(3))
  879. }
  880. func Test_Arguments_Int(t *testing.T) {
  881. var args = Arguments([]interface{}{"string", 123, true})
  882. assert.Equal(t, 123, args.Int(1))
  883. }
  884. func Test_Arguments_Bool(t *testing.T) {
  885. var args = Arguments([]interface{}{"string", 123, true})
  886. assert.Equal(t, true, args.Bool(2))
  887. }
  888. func Test_WaitUntil_Parallel(t *testing.T) {
  889. // make a test impl object
  890. var mockedService *TestExampleImplementation = new(TestExampleImplementation)
  891. ch1 := make(chan time.Time)
  892. ch2 := make(chan time.Time)
  893. mockedService.Mock.On("TheExampleMethod2", true).Return().WaitUntil(ch2).Run(func(args Arguments) {
  894. ch1 <- time.Now()
  895. })
  896. mockedService.Mock.On("TheExampleMethod2", false).Return().WaitUntil(ch1)
  897. // Lock both goroutines on the .WaitUntil method
  898. go func() {
  899. mockedService.TheExampleMethod2(false)
  900. }()
  901. go func() {
  902. mockedService.TheExampleMethod2(true)
  903. }()
  904. // Allow the first call to execute, so the second one executes afterwards
  905. ch2 <- time.Now()
  906. }
  907. func Test_MockMethodCalled(t *testing.T) {
  908. m := new(Mock)
  909. m.On("foo", "hello").Return("world")
  910. retArgs := m.MethodCalled("foo", "hello")
  911. require.True(t, len(retArgs) == 1)
  912. require.Equal(t, "world", retArgs[0])
  913. m.AssertExpectations(t)
  914. }
  915. // Test to validate fix for racy concurrent call access in MethodCalled()
  916. func Test_MockReturnAndCalledConcurrent(t *testing.T) {
  917. iterations := 1000
  918. m := &Mock{}
  919. call := m.On("ConcurrencyTestMethod")
  920. wg := sync.WaitGroup{}
  921. wg.Add(2)
  922. go func() {
  923. for i := 0; i < iterations; i++ {
  924. call.Return(10)
  925. }
  926. wg.Done()
  927. }()
  928. go func() {
  929. for i := 0; i < iterations; i++ {
  930. ConcurrencyTestMethod(m)
  931. }
  932. wg.Done()
  933. }()
  934. wg.Wait()
  935. }
  936. type timer struct{ Mock }
  937. func (s *timer) GetTime(i int) string {
  938. return s.Called(i).Get(0).(string)
  939. }
  940. func TestAfterTotalWaitTimeWhileExecution(t *testing.T) {
  941. waitDuration := 1
  942. total, waitMs := 5, time.Millisecond*time.Duration(waitDuration)
  943. aTimer := new(timer)
  944. for i := 0; i < total; i++ {
  945. aTimer.On("GetTime", i).After(waitMs).Return(fmt.Sprintf("Time%d", i)).Once()
  946. }
  947. time.Sleep(waitMs)
  948. start := time.Now()
  949. var results []string
  950. for i := 0; i < total; i++ {
  951. results = append(results, aTimer.GetTime(i))
  952. }
  953. end := time.Now()
  954. elapsedTime := end.Sub(start)
  955. assert.True(t, elapsedTime > waitMs, fmt.Sprintf("Total elapsed time:%v should be atleast greater than %v", elapsedTime, waitMs))
  956. assert.Equal(t, total, len(results))
  957. for i := range results {
  958. assert.Equal(t, fmt.Sprintf("Time%d", i), results[i], "Return value of method should be same")
  959. }
  960. }
  961. func ConcurrencyTestMethod(m *Mock) {
  962. m.Called()
  963. }