9 "github.com/stretchr/testify/assert"
10 "github.com/stretchr/testify/require"
17 // ExampleInterface represents an example interface.
18 type ExampleInterface interface {
19 TheExampleMethod(a, b, c int) (int, error)
22 // TestExampleImplementation is a test implementation of ExampleInterface
23 type TestExampleImplementation struct {
27 func (i *TestExampleImplementation) TheExampleMethod(a, b, c int) (int, error) {
28 args := i.Called(a, b, c)
29 return args.Int(0), errors.New("Whoops")
32 func (i *TestExampleImplementation) TheExampleMethod2(yesorno bool) {
36 type ExampleType struct {
40 func (i *TestExampleImplementation) TheExampleMethod3(et *ExampleType) error {
45 func (i *TestExampleImplementation) TheExampleMethodFunc(fn func(string) error) error {
50 func (i *TestExampleImplementation) TheExampleMethodVariadic(a ...int) error {
55 func (i *TestExampleImplementation) TheExampleMethodVariadicInterface(a ...interface{}) error {
60 func (i *TestExampleImplementation) TheExampleMethodMixedVariadic(a int, b ...int) error {
61 args := i.Called(a, b)
65 type ExampleFuncType func(string) error
67 func (i *TestExampleImplementation) TheExampleMethodFuncType(fn ExampleFuncType) error {
76 func Test_Mock_TestData(t *testing.T) {
78 var mockedService = new(TestExampleImplementation)
80 if assert.NotNil(t, mockedService.TestData()) {
82 mockedService.TestData().Set("something", 123)
83 assert.Equal(t, 123, mockedService.TestData().Get("something").Data())
87 func Test_Mock_On(t *testing.T) {
89 // make a test impl object
90 var mockedService = new(TestExampleImplementation)
92 c := mockedService.On("TheExampleMethod")
93 assert.Equal(t, []*Call{c}, mockedService.ExpectedCalls)
94 assert.Equal(t, "TheExampleMethod", c.Method)
97 func Test_Mock_Chained_On(t *testing.T) {
98 // make a test impl object
99 var mockedService = new(TestExampleImplementation)
102 On("TheExampleMethod", 1, 2, 3).
104 On("TheExampleMethod3", AnythingOfType("*mock.ExampleType")).
107 expectedCalls := []*Call{
109 Parent: &mockedService.Mock,
110 Method: "TheExampleMethod",
111 Arguments: []interface{}{1, 2, 3},
112 ReturnArguments: []interface{}{0},
115 Parent: &mockedService.Mock,
116 Method: "TheExampleMethod3",
117 Arguments: []interface{}{AnythingOfType("*mock.ExampleType")},
118 ReturnArguments: []interface{}{nil},
121 assert.Equal(t, expectedCalls, mockedService.ExpectedCalls)
124 func Test_Mock_On_WithArgs(t *testing.T) {
126 // make a test impl object
127 var mockedService = new(TestExampleImplementation)
129 c := mockedService.On("TheExampleMethod", 1, 2, 3, 4)
131 assert.Equal(t, []*Call{c}, mockedService.ExpectedCalls)
132 assert.Equal(t, "TheExampleMethod", c.Method)
133 assert.Equal(t, Arguments{1, 2, 3, 4}, c.Arguments)
136 func Test_Mock_On_WithFuncArg(t *testing.T) {
138 // make a test impl object
139 var mockedService = new(TestExampleImplementation)
142 On("TheExampleMethodFunc", AnythingOfType("func(string) error")).
145 assert.Equal(t, []*Call{c}, mockedService.ExpectedCalls)
146 assert.Equal(t, "TheExampleMethodFunc", c.Method)
147 assert.Equal(t, 1, len(c.Arguments))
148 assert.Equal(t, AnythingOfType("func(string) error"), c.Arguments[0])
150 fn := func(string) error { return nil }
152 assert.NotPanics(t, func() {
153 mockedService.TheExampleMethodFunc(fn)
157 func Test_Mock_On_WithIntArgMatcher(t *testing.T) {
158 var mockedService TestExampleImplementation
160 mockedService.On("TheExampleMethod",
161 MatchedBy(func(a int) bool {
163 }), MatchedBy(func(b int) bool {
165 }), MatchedBy(func(c int) bool {
169 assert.Panics(t, func() {
170 mockedService.TheExampleMethod(1, 2, 4)
172 assert.Panics(t, func() {
173 mockedService.TheExampleMethod(2, 2, 3)
175 assert.NotPanics(t, func() {
176 mockedService.TheExampleMethod(1, 2, 3)
180 func Test_Mock_On_WithPtrArgMatcher(t *testing.T) {
181 var mockedService TestExampleImplementation
183 mockedService.On("TheExampleMethod3",
184 MatchedBy(func(a *ExampleType) bool { return a.ran == true }),
187 mockedService.On("TheExampleMethod3",
188 MatchedBy(func(a *ExampleType) bool { return a.ran == false }),
189 ).Return(errors.New("error"))
191 assert.Equal(t, mockedService.TheExampleMethod3(&ExampleType{true}), nil)
192 assert.EqualError(t, mockedService.TheExampleMethod3(&ExampleType{false}), "error")
195 func Test_Mock_On_WithFuncArgMatcher(t *testing.T) {
196 var mockedService TestExampleImplementation
198 fixture1, fixture2 := errors.New("fixture1"), errors.New("fixture2")
200 mockedService.On("TheExampleMethodFunc",
201 MatchedBy(func(a func(string) error) bool { return a("string") == fixture1 }),
202 ).Return(errors.New("fixture1"))
204 mockedService.On("TheExampleMethodFunc",
205 MatchedBy(func(a func(string) error) bool { return a("string") == fixture2 }),
206 ).Return(errors.New("fixture2"))
208 assert.EqualError(t, mockedService.TheExampleMethodFunc(
209 func(string) error { return fixture1 }), "fixture1")
210 assert.EqualError(t, mockedService.TheExampleMethodFunc(
211 func(string) error { return fixture2 }), "fixture2")
214 func Test_Mock_On_WithVariadicFunc(t *testing.T) {
216 // make a test impl object
217 var mockedService = new(TestExampleImplementation)
220 On("TheExampleMethodVariadic", []int{1, 2, 3}).
223 assert.Equal(t, []*Call{c}, mockedService.ExpectedCalls)
224 assert.Equal(t, 1, len(c.Arguments))
225 assert.Equal(t, []int{1, 2, 3}, c.Arguments[0])
227 assert.NotPanics(t, func() {
228 mockedService.TheExampleMethodVariadic(1, 2, 3)
230 assert.Panics(t, func() {
231 mockedService.TheExampleMethodVariadic(1, 2)
236 func Test_Mock_On_WithMixedVariadicFunc(t *testing.T) {
238 // make a test impl object
239 var mockedService = new(TestExampleImplementation)
242 On("TheExampleMethodMixedVariadic", 1, []int{2, 3, 4}).
245 assert.Equal(t, []*Call{c}, mockedService.ExpectedCalls)
246 assert.Equal(t, 2, len(c.Arguments))
247 assert.Equal(t, 1, c.Arguments[0])
248 assert.Equal(t, []int{2, 3, 4}, c.Arguments[1])
250 assert.NotPanics(t, func() {
251 mockedService.TheExampleMethodMixedVariadic(1, 2, 3, 4)
253 assert.Panics(t, func() {
254 mockedService.TheExampleMethodMixedVariadic(1, 2, 3, 5)
259 func Test_Mock_On_WithVariadicFuncWithInterface(t *testing.T) {
261 // make a test impl object
262 var mockedService = new(TestExampleImplementation)
264 c := mockedService.On("TheExampleMethodVariadicInterface", []interface{}{1, 2, 3}).
267 assert.Equal(t, []*Call{c}, mockedService.ExpectedCalls)
268 assert.Equal(t, 1, len(c.Arguments))
269 assert.Equal(t, []interface{}{1, 2, 3}, c.Arguments[0])
271 assert.NotPanics(t, func() {
272 mockedService.TheExampleMethodVariadicInterface(1, 2, 3)
274 assert.Panics(t, func() {
275 mockedService.TheExampleMethodVariadicInterface(1, 2)
280 func Test_Mock_On_WithVariadicFuncWithEmptyInterfaceArray(t *testing.T) {
282 // make a test impl object
283 var mockedService = new(TestExampleImplementation)
285 var expected []interface{}
287 On("TheExampleMethodVariadicInterface", expected).
290 assert.Equal(t, []*Call{c}, mockedService.ExpectedCalls)
291 assert.Equal(t, 1, len(c.Arguments))
292 assert.Equal(t, expected, c.Arguments[0])
294 assert.NotPanics(t, func() {
295 mockedService.TheExampleMethodVariadicInterface()
297 assert.Panics(t, func() {
298 mockedService.TheExampleMethodVariadicInterface(1, 2)
303 func Test_Mock_On_WithFuncPanics(t *testing.T) {
304 // make a test impl object
305 var mockedService = new(TestExampleImplementation)
307 assert.Panics(t, func() {
308 mockedService.On("TheExampleMethodFunc", func(string) error { return nil })
312 func Test_Mock_On_WithFuncTypeArg(t *testing.T) {
314 // make a test impl object
315 var mockedService = new(TestExampleImplementation)
318 On("TheExampleMethodFuncType", AnythingOfType("mock.ExampleFuncType")).
321 assert.Equal(t, []*Call{c}, mockedService.ExpectedCalls)
322 assert.Equal(t, 1, len(c.Arguments))
323 assert.Equal(t, AnythingOfType("mock.ExampleFuncType"), c.Arguments[0])
325 fn := func(string) error { return nil }
326 assert.NotPanics(t, func() {
327 mockedService.TheExampleMethodFuncType(fn)
331 func Test_Mock_Return(t *testing.T) {
333 // make a test impl object
334 var mockedService = new(TestExampleImplementation)
337 On("TheExampleMethod", "A", "B", true).
338 Return(1, "two", true)
340 require.Equal(t, []*Call{c}, mockedService.ExpectedCalls)
342 call := mockedService.ExpectedCalls[0]
344 assert.Equal(t, "TheExampleMethod", call.Method)
345 assert.Equal(t, "A", call.Arguments[0])
346 assert.Equal(t, "B", call.Arguments[1])
347 assert.Equal(t, true, call.Arguments[2])
348 assert.Equal(t, 1, call.ReturnArguments[0])
349 assert.Equal(t, "two", call.ReturnArguments[1])
350 assert.Equal(t, true, call.ReturnArguments[2])
351 assert.Equal(t, 0, call.Repeatability)
352 assert.Nil(t, call.WaitFor)
355 func Test_Mock_Return_WaitUntil(t *testing.T) {
357 // make a test impl object
358 var mockedService = new(TestExampleImplementation)
359 ch := time.After(time.Second)
361 c := mockedService.Mock.
362 On("TheExampleMethod", "A", "B", true).
364 Return(1, "two", true)
366 // assert that the call was created
367 require.Equal(t, []*Call{c}, mockedService.ExpectedCalls)
369 call := mockedService.ExpectedCalls[0]
371 assert.Equal(t, "TheExampleMethod", call.Method)
372 assert.Equal(t, "A", call.Arguments[0])
373 assert.Equal(t, "B", call.Arguments[1])
374 assert.Equal(t, true, call.Arguments[2])
375 assert.Equal(t, 1, call.ReturnArguments[0])
376 assert.Equal(t, "two", call.ReturnArguments[1])
377 assert.Equal(t, true, call.ReturnArguments[2])
378 assert.Equal(t, 0, call.Repeatability)
379 assert.Equal(t, ch, call.WaitFor)
382 func Test_Mock_Return_After(t *testing.T) {
384 // make a test impl object
385 var mockedService = new(TestExampleImplementation)
387 c := mockedService.Mock.
388 On("TheExampleMethod", "A", "B", true).
389 Return(1, "two", true).
392 require.Equal(t, []*Call{c}, mockedService.ExpectedCalls)
394 call := mockedService.Mock.ExpectedCalls[0]
396 assert.Equal(t, "TheExampleMethod", call.Method)
397 assert.Equal(t, "A", call.Arguments[0])
398 assert.Equal(t, "B", call.Arguments[1])
399 assert.Equal(t, true, call.Arguments[2])
400 assert.Equal(t, 1, call.ReturnArguments[0])
401 assert.Equal(t, "two", call.ReturnArguments[1])
402 assert.Equal(t, true, call.ReturnArguments[2])
403 assert.Equal(t, 0, call.Repeatability)
404 assert.NotEqual(t, nil, call.WaitFor)
408 func Test_Mock_Return_Run(t *testing.T) {
410 // make a test impl object
411 var mockedService = new(TestExampleImplementation)
413 fn := func(args Arguments) {
414 arg := args.Get(0).(*ExampleType)
418 c := mockedService.Mock.
419 On("TheExampleMethod3", AnythingOfType("*mock.ExampleType")).
423 require.Equal(t, []*Call{c}, mockedService.ExpectedCalls)
425 call := mockedService.Mock.ExpectedCalls[0]
427 assert.Equal(t, "TheExampleMethod3", call.Method)
428 assert.Equal(t, AnythingOfType("*mock.ExampleType"), call.Arguments[0])
429 assert.Equal(t, nil, call.ReturnArguments[0])
430 assert.Equal(t, 0, call.Repeatability)
431 assert.NotEqual(t, nil, call.WaitFor)
432 assert.NotNil(t, call.Run)
435 assert.Equal(t, false, et.ran)
436 mockedService.TheExampleMethod3(&et)
437 assert.Equal(t, true, et.ran)
440 func Test_Mock_Return_Run_Out_Of_Order(t *testing.T) {
441 // make a test impl object
442 var mockedService = new(TestExampleImplementation)
443 f := func(args Arguments) {
444 arg := args.Get(0).(*ExampleType)
448 c := mockedService.Mock.
449 On("TheExampleMethod3", AnythingOfType("*mock.ExampleType")).
453 require.Equal(t, []*Call{c}, mockedService.ExpectedCalls)
455 call := mockedService.Mock.ExpectedCalls[0]
457 assert.Equal(t, "TheExampleMethod3", call.Method)
458 assert.Equal(t, AnythingOfType("*mock.ExampleType"), call.Arguments[0])
459 assert.Equal(t, nil, call.ReturnArguments[0])
460 assert.Equal(t, 0, call.Repeatability)
461 assert.NotEqual(t, nil, call.WaitFor)
462 assert.NotNil(t, call.Run)
465 func Test_Mock_Return_Once(t *testing.T) {
467 // make a test impl object
468 var mockedService = new(TestExampleImplementation)
470 c := mockedService.On("TheExampleMethod", "A", "B", true).
471 Return(1, "two", true).
474 require.Equal(t, []*Call{c}, mockedService.ExpectedCalls)
476 call := mockedService.ExpectedCalls[0]
478 assert.Equal(t, "TheExampleMethod", call.Method)
479 assert.Equal(t, "A", call.Arguments[0])
480 assert.Equal(t, "B", call.Arguments[1])
481 assert.Equal(t, true, call.Arguments[2])
482 assert.Equal(t, 1, call.ReturnArguments[0])
483 assert.Equal(t, "two", call.ReturnArguments[1])
484 assert.Equal(t, true, call.ReturnArguments[2])
485 assert.Equal(t, 1, call.Repeatability)
486 assert.Nil(t, call.WaitFor)
489 func Test_Mock_Return_Twice(t *testing.T) {
491 // make a test impl object
492 var mockedService = new(TestExampleImplementation)
495 On("TheExampleMethod", "A", "B", true).
496 Return(1, "two", true).
499 require.Equal(t, []*Call{c}, mockedService.ExpectedCalls)
501 call := mockedService.ExpectedCalls[0]
503 assert.Equal(t, "TheExampleMethod", call.Method)
504 assert.Equal(t, "A", call.Arguments[0])
505 assert.Equal(t, "B", call.Arguments[1])
506 assert.Equal(t, true, call.Arguments[2])
507 assert.Equal(t, 1, call.ReturnArguments[0])
508 assert.Equal(t, "two", call.ReturnArguments[1])
509 assert.Equal(t, true, call.ReturnArguments[2])
510 assert.Equal(t, 2, call.Repeatability)
511 assert.Nil(t, call.WaitFor)
514 func Test_Mock_Return_Times(t *testing.T) {
516 // make a test impl object
517 var mockedService = new(TestExampleImplementation)
520 On("TheExampleMethod", "A", "B", true).
521 Return(1, "two", true).
524 require.Equal(t, []*Call{c}, mockedService.ExpectedCalls)
526 call := mockedService.ExpectedCalls[0]
528 assert.Equal(t, "TheExampleMethod", call.Method)
529 assert.Equal(t, "A", call.Arguments[0])
530 assert.Equal(t, "B", call.Arguments[1])
531 assert.Equal(t, true, call.Arguments[2])
532 assert.Equal(t, 1, call.ReturnArguments[0])
533 assert.Equal(t, "two", call.ReturnArguments[1])
534 assert.Equal(t, true, call.ReturnArguments[2])
535 assert.Equal(t, 5, call.Repeatability)
536 assert.Nil(t, call.WaitFor)
539 func Test_Mock_Return_Nothing(t *testing.T) {
541 // make a test impl object
542 var mockedService = new(TestExampleImplementation)
545 On("TheExampleMethod", "A", "B", true).
548 require.Equal(t, []*Call{c}, mockedService.ExpectedCalls)
550 call := mockedService.ExpectedCalls[0]
552 assert.Equal(t, "TheExampleMethod", call.Method)
553 assert.Equal(t, "A", call.Arguments[0])
554 assert.Equal(t, "B", call.Arguments[1])
555 assert.Equal(t, true, call.Arguments[2])
556 assert.Equal(t, 0, len(call.ReturnArguments))
559 func Test_Mock_findExpectedCall(t *testing.T) {
562 m.On("One", 1).Return("one")
563 m.On("Two", 2).Return("two")
564 m.On("Two", 3).Return("three")
566 f, c := m.findExpectedCall("Two", 3)
568 if assert.Equal(t, 2, f) {
569 if assert.NotNil(t, c) {
570 assert.Equal(t, "Two", c.Method)
571 assert.Equal(t, 3, c.Arguments[0])
572 assert.Equal(t, "three", c.ReturnArguments[0])
578 func Test_Mock_findExpectedCall_For_Unknown_Method(t *testing.T) {
581 m.On("One", 1).Return("one")
582 m.On("Two", 2).Return("two")
583 m.On("Two", 3).Return("three")
585 f, _ := m.findExpectedCall("Two")
587 assert.Equal(t, -1, f)
591 func Test_Mock_findExpectedCall_Respects_Repeatability(t *testing.T) {
594 m.On("One", 1).Return("one")
595 m.On("Two", 2).Return("two").Once()
596 m.On("Two", 3).Return("three").Twice()
597 m.On("Two", 3).Return("three").Times(8)
599 f, c := m.findExpectedCall("Two", 3)
601 if assert.Equal(t, 2, f) {
602 if assert.NotNil(t, c) {
603 assert.Equal(t, "Two", c.Method)
604 assert.Equal(t, 3, c.Arguments[0])
605 assert.Equal(t, "three", c.ReturnArguments[0])
611 func Test_callString(t *testing.T) {
613 assert.Equal(t, `Method(int,bool,string)`, callString("Method", []interface{}{1, true, "something"}, false))
617 func Test_Mock_Called(t *testing.T) {
619 var mockedService = new(TestExampleImplementation)
621 mockedService.On("Test_Mock_Called", 1, 2, 3).Return(5, "6", true)
623 returnArguments := mockedService.Called(1, 2, 3)
625 if assert.Equal(t, 1, len(mockedService.Calls)) {
626 assert.Equal(t, "Test_Mock_Called", mockedService.Calls[0].Method)
627 assert.Equal(t, 1, mockedService.Calls[0].Arguments[0])
628 assert.Equal(t, 2, mockedService.Calls[0].Arguments[1])
629 assert.Equal(t, 3, mockedService.Calls[0].Arguments[2])
632 if assert.Equal(t, 3, len(returnArguments)) {
633 assert.Equal(t, 5, returnArguments[0])
634 assert.Equal(t, "6", returnArguments[1])
635 assert.Equal(t, true, returnArguments[2])
640 func asyncCall(m *Mock, ch chan Arguments) {
641 ch <- m.Called(1, 2, 3)
644 func Test_Mock_Called_blocks(t *testing.T) {
646 var mockedService = new(TestExampleImplementation)
648 mockedService.Mock.On("asyncCall", 1, 2, 3).Return(5, "6", true).After(2 * time.Millisecond)
650 ch := make(chan Arguments)
652 go asyncCall(&mockedService.Mock, ch)
656 t.Fatal("should have waited")
657 case <-time.After(1 * time.Millisecond):
660 returnArguments := <-ch
662 if assert.Equal(t, 1, len(mockedService.Mock.Calls)) {
663 assert.Equal(t, "asyncCall", mockedService.Mock.Calls[0].Method)
664 assert.Equal(t, 1, mockedService.Mock.Calls[0].Arguments[0])
665 assert.Equal(t, 2, mockedService.Mock.Calls[0].Arguments[1])
666 assert.Equal(t, 3, mockedService.Mock.Calls[0].Arguments[2])
669 if assert.Equal(t, 3, len(returnArguments)) {
670 assert.Equal(t, 5, returnArguments[0])
671 assert.Equal(t, "6", returnArguments[1])
672 assert.Equal(t, true, returnArguments[2])
677 func Test_Mock_Called_For_Bounded_Repeatability(t *testing.T) {
679 var mockedService = new(TestExampleImplementation)
682 On("Test_Mock_Called_For_Bounded_Repeatability", 1, 2, 3).
683 Return(5, "6", true).
686 On("Test_Mock_Called_For_Bounded_Repeatability", 1, 2, 3).
687 Return(-1, "hi", false)
689 returnArguments1 := mockedService.Called(1, 2, 3)
690 returnArguments2 := mockedService.Called(1, 2, 3)
692 if assert.Equal(t, 2, len(mockedService.Calls)) {
693 assert.Equal(t, "Test_Mock_Called_For_Bounded_Repeatability", mockedService.Calls[0].Method)
694 assert.Equal(t, 1, mockedService.Calls[0].Arguments[0])
695 assert.Equal(t, 2, mockedService.Calls[0].Arguments[1])
696 assert.Equal(t, 3, mockedService.Calls[0].Arguments[2])
698 assert.Equal(t, "Test_Mock_Called_For_Bounded_Repeatability", mockedService.Calls[1].Method)
699 assert.Equal(t, 1, mockedService.Calls[1].Arguments[0])
700 assert.Equal(t, 2, mockedService.Calls[1].Arguments[1])
701 assert.Equal(t, 3, mockedService.Calls[1].Arguments[2])
704 if assert.Equal(t, 3, len(returnArguments1)) {
705 assert.Equal(t, 5, returnArguments1[0])
706 assert.Equal(t, "6", returnArguments1[1])
707 assert.Equal(t, true, returnArguments1[2])
710 if assert.Equal(t, 3, len(returnArguments2)) {
711 assert.Equal(t, -1, returnArguments2[0])
712 assert.Equal(t, "hi", returnArguments2[1])
713 assert.Equal(t, false, returnArguments2[2])
718 func Test_Mock_Called_For_SetTime_Expectation(t *testing.T) {
720 var mockedService = new(TestExampleImplementation)
722 mockedService.On("TheExampleMethod", 1, 2, 3).Return(5, "6", true).Times(4)
724 mockedService.TheExampleMethod(1, 2, 3)
725 mockedService.TheExampleMethod(1, 2, 3)
726 mockedService.TheExampleMethod(1, 2, 3)
727 mockedService.TheExampleMethod(1, 2, 3)
728 assert.Panics(t, func() {
729 mockedService.TheExampleMethod(1, 2, 3)
734 func Test_Mock_Called_Unexpected(t *testing.T) {
736 var mockedService = new(TestExampleImplementation)
738 // make sure it panics if no expectation was made
739 assert.Panics(t, func() {
740 mockedService.Called(1, 2, 3)
741 }, "Calling unexpected method should panic")
745 func Test_AssertExpectationsForObjects_Helper(t *testing.T) {
747 var mockedService1 = new(TestExampleImplementation)
748 var mockedService2 = new(TestExampleImplementation)
749 var mockedService3 = new(TestExampleImplementation)
751 mockedService1.On("Test_AssertExpectationsForObjects_Helper", 1).Return()
752 mockedService2.On("Test_AssertExpectationsForObjects_Helper", 2).Return()
753 mockedService3.On("Test_AssertExpectationsForObjects_Helper", 3).Return()
755 mockedService1.Called(1)
756 mockedService2.Called(2)
757 mockedService3.Called(3)
759 assert.True(t, AssertExpectationsForObjects(t, &mockedService1.Mock, &mockedService2.Mock, &mockedService3.Mock))
760 assert.True(t, AssertExpectationsForObjects(t, mockedService1, mockedService2, mockedService3))
764 func Test_AssertExpectationsForObjects_Helper_Failed(t *testing.T) {
766 var mockedService1 = new(TestExampleImplementation)
767 var mockedService2 = new(TestExampleImplementation)
768 var mockedService3 = new(TestExampleImplementation)
770 mockedService1.On("Test_AssertExpectationsForObjects_Helper_Failed", 1).Return()
771 mockedService2.On("Test_AssertExpectationsForObjects_Helper_Failed", 2).Return()
772 mockedService3.On("Test_AssertExpectationsForObjects_Helper_Failed", 3).Return()
774 mockedService1.Called(1)
775 mockedService3.Called(3)
778 assert.False(t, AssertExpectationsForObjects(tt, &mockedService1.Mock, &mockedService2.Mock, &mockedService3.Mock))
779 assert.False(t, AssertExpectationsForObjects(tt, mockedService1, mockedService2, mockedService3))
783 func Test_Mock_AssertExpectations(t *testing.T) {
785 var mockedService = new(TestExampleImplementation)
787 mockedService.On("Test_Mock_AssertExpectations", 1, 2, 3).Return(5, 6, 7)
790 assert.False(t, mockedService.AssertExpectations(tt))
793 mockedService.Called(1, 2, 3)
795 // now assert expectations
796 assert.True(t, mockedService.AssertExpectations(tt))
800 func Test_Mock_AssertExpectations_Placeholder_NoArgs(t *testing.T) {
802 var mockedService = new(TestExampleImplementation)
804 mockedService.On("Test_Mock_AssertExpectations_Placeholder_NoArgs").Return(5, 6, 7).Once()
805 mockedService.On("Test_Mock_AssertExpectations_Placeholder_NoArgs").Return(7, 6, 5)
808 assert.False(t, mockedService.AssertExpectations(tt))
811 mockedService.Called()
813 // now assert expectations
814 assert.True(t, mockedService.AssertExpectations(tt))
818 func Test_Mock_AssertExpectations_Placeholder(t *testing.T) {
820 var mockedService = new(TestExampleImplementation)
822 mockedService.On("Test_Mock_AssertExpectations_Placeholder", 1, 2, 3).Return(5, 6, 7).Once()
823 mockedService.On("Test_Mock_AssertExpectations_Placeholder", 3, 2, 1).Return(7, 6, 5)
826 assert.False(t, mockedService.AssertExpectations(tt))
829 mockedService.Called(1, 2, 3)
831 // now assert expectations
832 assert.False(t, mockedService.AssertExpectations(tt))
834 // make call to the second expectation
835 mockedService.Called(3, 2, 1)
837 // now assert expectations again
838 assert.True(t, mockedService.AssertExpectations(tt))
841 func Test_Mock_AssertExpectations_With_Pointers(t *testing.T) {
843 var mockedService = new(TestExampleImplementation)
845 mockedService.On("Test_Mock_AssertExpectations_With_Pointers", &struct{ Foo int }{1}).Return(1)
846 mockedService.On("Test_Mock_AssertExpectations_With_Pointers", &struct{ Foo int }{2}).Return(2)
849 assert.False(t, mockedService.AssertExpectations(tt))
851 s := struct{ Foo int }{1}
852 // make the calls now
853 mockedService.Called(&s)
855 mockedService.Called(&s)
857 // now assert expectations
858 assert.True(t, mockedService.AssertExpectations(tt))
862 func Test_Mock_AssertExpectationsCustomType(t *testing.T) {
864 var mockedService = new(TestExampleImplementation)
866 mockedService.On("TheExampleMethod3", AnythingOfType("*mock.ExampleType")).Return(nil).Once()
869 assert.False(t, mockedService.AssertExpectations(tt))
872 mockedService.TheExampleMethod3(&ExampleType{})
874 // now assert expectations
875 assert.True(t, mockedService.AssertExpectations(tt))
879 func Test_Mock_AssertExpectations_With_Repeatability(t *testing.T) {
881 var mockedService = new(TestExampleImplementation)
883 mockedService.On("Test_Mock_AssertExpectations_With_Repeatability", 1, 2, 3).Return(5, 6, 7).Twice()
886 assert.False(t, mockedService.AssertExpectations(tt))
889 mockedService.Called(1, 2, 3)
891 assert.False(t, mockedService.AssertExpectations(tt))
893 mockedService.Called(1, 2, 3)
895 // now assert expectations
896 assert.True(t, mockedService.AssertExpectations(tt))
900 func Test_Mock_TwoCallsWithDifferentArguments(t *testing.T) {
902 var mockedService = new(TestExampleImplementation)
904 mockedService.On("Test_Mock_TwoCallsWithDifferentArguments", 1, 2, 3).Return(5, 6, 7)
905 mockedService.On("Test_Mock_TwoCallsWithDifferentArguments", 4, 5, 6).Return(5, 6, 7)
907 args1 := mockedService.Called(1, 2, 3)
908 assert.Equal(t, 5, args1.Int(0))
909 assert.Equal(t, 6, args1.Int(1))
910 assert.Equal(t, 7, args1.Int(2))
912 args2 := mockedService.Called(4, 5, 6)
913 assert.Equal(t, 5, args2.Int(0))
914 assert.Equal(t, 6, args2.Int(1))
915 assert.Equal(t, 7, args2.Int(2))
919 func Test_Mock_AssertNumberOfCalls(t *testing.T) {
921 var mockedService = new(TestExampleImplementation)
923 mockedService.On("Test_Mock_AssertNumberOfCalls", 1, 2, 3).Return(5, 6, 7)
925 mockedService.Called(1, 2, 3)
926 assert.True(t, mockedService.AssertNumberOfCalls(t, "Test_Mock_AssertNumberOfCalls", 1))
928 mockedService.Called(1, 2, 3)
929 assert.True(t, mockedService.AssertNumberOfCalls(t, "Test_Mock_AssertNumberOfCalls", 2))
933 func Test_Mock_AssertCalled(t *testing.T) {
935 var mockedService = new(TestExampleImplementation)
937 mockedService.On("Test_Mock_AssertCalled", 1, 2, 3).Return(5, 6, 7)
939 mockedService.Called(1, 2, 3)
941 assert.True(t, mockedService.AssertCalled(t, "Test_Mock_AssertCalled", 1, 2, 3))
945 func Test_Mock_AssertCalled_WithAnythingOfTypeArgument(t *testing.T) {
947 var mockedService = new(TestExampleImplementation)
950 On("Test_Mock_AssertCalled_WithAnythingOfTypeArgument", Anything, Anything, Anything).
953 mockedService.Called(1, "two", []uint8("three"))
955 assert.True(t, mockedService.AssertCalled(t, "Test_Mock_AssertCalled_WithAnythingOfTypeArgument", AnythingOfType("int"), AnythingOfType("string"), AnythingOfType("[]uint8")))
959 func Test_Mock_AssertCalled_WithArguments(t *testing.T) {
961 var mockedService = new(TestExampleImplementation)
963 mockedService.On("Test_Mock_AssertCalled_WithArguments", 1, 2, 3).Return(5, 6, 7)
965 mockedService.Called(1, 2, 3)
968 assert.True(t, mockedService.AssertCalled(tt, "Test_Mock_AssertCalled_WithArguments", 1, 2, 3))
969 assert.False(t, mockedService.AssertCalled(tt, "Test_Mock_AssertCalled_WithArguments", 2, 3, 4))
973 func Test_Mock_AssertCalled_WithArguments_With_Repeatability(t *testing.T) {
975 var mockedService = new(TestExampleImplementation)
977 mockedService.On("Test_Mock_AssertCalled_WithArguments_With_Repeatability", 1, 2, 3).Return(5, 6, 7).Once()
978 mockedService.On("Test_Mock_AssertCalled_WithArguments_With_Repeatability", 2, 3, 4).Return(5, 6, 7).Once()
980 mockedService.Called(1, 2, 3)
981 mockedService.Called(2, 3, 4)
984 assert.True(t, mockedService.AssertCalled(tt, "Test_Mock_AssertCalled_WithArguments_With_Repeatability", 1, 2, 3))
985 assert.True(t, mockedService.AssertCalled(tt, "Test_Mock_AssertCalled_WithArguments_With_Repeatability", 2, 3, 4))
986 assert.False(t, mockedService.AssertCalled(tt, "Test_Mock_AssertCalled_WithArguments_With_Repeatability", 3, 4, 5))
990 func Test_Mock_AssertNotCalled(t *testing.T) {
992 var mockedService = new(TestExampleImplementation)
994 mockedService.On("Test_Mock_AssertNotCalled", 1, 2, 3).Return(5, 6, 7)
996 mockedService.Called(1, 2, 3)
998 assert.True(t, mockedService.AssertNotCalled(t, "Test_Mock_NotCalled"))
1003 Arguments helper methods
1005 func Test_Arguments_Get(t *testing.T) {
1007 var args = Arguments([]interface{}{"string", 123, true})
1009 assert.Equal(t, "string", args.Get(0).(string))
1010 assert.Equal(t, 123, args.Get(1).(int))
1011 assert.Equal(t, true, args.Get(2).(bool))
1015 func Test_Arguments_Is(t *testing.T) {
1017 var args = Arguments([]interface{}{"string", 123, true})
1019 assert.True(t, args.Is("string", 123, true))
1020 assert.False(t, args.Is("wrong", 456, false))
1024 func Test_Arguments_Diff(t *testing.T) {
1026 var args = Arguments([]interface{}{"Hello World", 123, true})
1029 diff, count = args.Diff([]interface{}{"Hello World", 456, "false"})
1031 assert.Equal(t, 2, count)
1032 assert.Contains(t, diff, `%!s(int=456) != %!s(int=123)`)
1033 assert.Contains(t, diff, `false != %!s(bool=true)`)
1037 func Test_Arguments_Diff_DifferentNumberOfArgs(t *testing.T) {
1039 var args = Arguments([]interface{}{"string", 123, true})
1042 diff, count = args.Diff([]interface{}{"string", 456, "false", "extra"})
1044 assert.Equal(t, 3, count)
1045 assert.Contains(t, diff, `extra != (Missing)`)
1049 func Test_Arguments_Diff_WithAnythingArgument(t *testing.T) {
1051 var args = Arguments([]interface{}{"string", 123, true})
1053 _, count = args.Diff([]interface{}{"string", Anything, true})
1055 assert.Equal(t, 0, count)
1059 func Test_Arguments_Diff_WithAnythingArgument_InActualToo(t *testing.T) {
1061 var args = Arguments([]interface{}{"string", Anything, true})
1063 _, count = args.Diff([]interface{}{"string", 123, true})
1065 assert.Equal(t, 0, count)
1069 func Test_Arguments_Diff_WithAnythingOfTypeArgument(t *testing.T) {
1071 var args = Arguments([]interface{}{"string", AnythingOfType("int"), true})
1073 _, count = args.Diff([]interface{}{"string", 123, true})
1075 assert.Equal(t, 0, count)
1079 func Test_Arguments_Diff_WithAnythingOfTypeArgument_Failing(t *testing.T) {
1081 var args = Arguments([]interface{}{"string", AnythingOfType("string"), true})
1084 diff, count = args.Diff([]interface{}{"string", 123, true})
1086 assert.Equal(t, 1, count)
1087 assert.Contains(t, diff, `string != type int - %!s(int=123)`)
1091 func Test_Arguments_Diff_WithArgMatcher(t *testing.T) {
1092 matchFn := func(a int) bool {
1095 var args = Arguments([]interface{}{"string", MatchedBy(matchFn), true})
1097 diff, count := args.Diff([]interface{}{"string", 124, true})
1098 assert.Equal(t, 1, count)
1099 assert.Contains(t, diff, `%!s(int=124) not matched by func(int) bool`)
1101 diff, count = args.Diff([]interface{}{"string", false, true})
1102 assert.Equal(t, 1, count)
1103 assert.Contains(t, diff, `%!s(bool=false) not matched by func(int) bool`)
1105 diff, count = args.Diff([]interface{}{"string", 123, false})
1106 assert.Contains(t, diff, `%!s(int=123) matched by func(int) bool`)
1108 diff, count = args.Diff([]interface{}{"string", 123, true})
1109 assert.Equal(t, 0, count)
1110 assert.Contains(t, diff, `No differences.`)
1113 func Test_Arguments_Assert(t *testing.T) {
1115 var args = Arguments([]interface{}{"string", 123, true})
1117 assert.True(t, args.Assert(t, "string", 123, true))
1121 func Test_Arguments_String_Representation(t *testing.T) {
1123 var args = Arguments([]interface{}{"string", 123, true})
1124 assert.Equal(t, `string,int,bool`, args.String())
1128 func Test_Arguments_String(t *testing.T) {
1130 var args = Arguments([]interface{}{"string", 123, true})
1131 assert.Equal(t, "string", args.String(0))
1135 func Test_Arguments_Error(t *testing.T) {
1137 var err = errors.New("An Error")
1138 var args = Arguments([]interface{}{"string", 123, true, err})
1139 assert.Equal(t, err, args.Error(3))
1143 func Test_Arguments_Error_Nil(t *testing.T) {
1145 var args = Arguments([]interface{}{"string", 123, true, nil})
1146 assert.Equal(t, nil, args.Error(3))
1150 func Test_Arguments_Int(t *testing.T) {
1152 var args = Arguments([]interface{}{"string", 123, true})
1153 assert.Equal(t, 123, args.Int(1))
1157 func Test_Arguments_Bool(t *testing.T) {
1159 var args = Arguments([]interface{}{"string", 123, true})
1160 assert.Equal(t, true, args.Bool(2))
1164 func Test_WaitUntil_Parallel(t *testing.T) {
1166 // make a test impl object
1167 var mockedService *TestExampleImplementation = new(TestExampleImplementation)
1169 ch1 := make(chan time.Time)
1170 ch2 := make(chan time.Time)
1172 mockedService.Mock.On("TheExampleMethod2", true).Return().WaitUntil(ch2).Run(func(args Arguments) {
1176 mockedService.Mock.On("TheExampleMethod2", false).Return().WaitUntil(ch1)
1178 // Lock both goroutines on the .WaitUntil method
1180 mockedService.TheExampleMethod2(false)
1183 mockedService.TheExampleMethod2(true)
1186 // Allow the first call to execute, so the second one executes afterwards
1190 func Test_MockMethodCalled(t *testing.T) {
1192 m.On("foo", "hello").Return("world")
1194 retArgs := m.MethodCalled("foo", "hello")
1195 require.True(t, len(retArgs) == 1)
1196 require.Equal(t, "world", retArgs[0])
1197 m.AssertExpectations(t)
1200 // Test to validate fix for racy concurrent call access in MethodCalled()
1201 func Test_MockReturnAndCalledConcurrent(t *testing.T) {
1204 call := m.On("ConcurrencyTestMethod")
1206 wg := sync.WaitGroup{}
1210 for i := 0; i < iterations; i++ {
1216 for i := 0; i < iterations; i++ {
1217 ConcurrencyTestMethod(m)
1224 func ConcurrencyTestMethod(m *Mock) {