| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352 |
- package mock
- import (
- "errors"
- "fmt"
- "sync"
- "testing"
- "time"
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
- )
- /*
- Test objects
- */
- // ExampleInterface represents an example interface.
- type ExampleInterface interface {
- TheExampleMethod(a, b, c int) (int, error)
- }
- // TestExampleImplementation is a test implementation of ExampleInterface
- type TestExampleImplementation struct {
- Mock
- }
- func (i *TestExampleImplementation) TheExampleMethod(a, b, c int) (int, error) {
- args := i.Called(a, b, c)
- return args.Int(0), errors.New("Whoops")
- }
- func (i *TestExampleImplementation) TheExampleMethod2(yesorno bool) {
- i.Called(yesorno)
- }
- type ExampleType struct {
- ran bool
- }
- func (i *TestExampleImplementation) TheExampleMethod3(et *ExampleType) error {
- args := i.Called(et)
- return args.Error(0)
- }
- func (i *TestExampleImplementation) TheExampleMethod4(v ExampleInterface) error {
- args := i.Called(v)
- return args.Error(0)
- }
- func (i *TestExampleImplementation) TheExampleMethod5(ch chan struct{}) error {
- args := i.Called(ch)
- return args.Error(0)
- }
- func (i *TestExampleImplementation) TheExampleMethod6(m map[string]bool) error {
- args := i.Called(m)
- return args.Error(0)
- }
- func (i *TestExampleImplementation) TheExampleMethod7(slice []bool) error {
- args := i.Called(slice)
- return args.Error(0)
- }
- func (i *TestExampleImplementation) TheExampleMethodFunc(fn func(string) error) error {
- args := i.Called(fn)
- return args.Error(0)
- }
- func (i *TestExampleImplementation) TheExampleMethodVariadic(a ...int) error {
- args := i.Called(a)
- return args.Error(0)
- }
- func (i *TestExampleImplementation) TheExampleMethodVariadicInterface(a ...interface{}) error {
- args := i.Called(a)
- return args.Error(0)
- }
- func (i *TestExampleImplementation) TheExampleMethodMixedVariadic(a int, b ...int) error {
- args := i.Called(a, b)
- return args.Error(0)
- }
- type ExampleFuncType func(string) error
- func (i *TestExampleImplementation) TheExampleMethodFuncType(fn ExampleFuncType) error {
- args := i.Called(fn)
- return args.Error(0)
- }
- /*
- Mock
- */
- func Test_Mock_TestData(t *testing.T) {
- var mockedService = new(TestExampleImplementation)
- if assert.NotNil(t, mockedService.TestData()) {
- mockedService.TestData().Set("something", 123)
- assert.Equal(t, 123, mockedService.TestData().Get("something").Data())
- }
- }
- func Test_Mock_On(t *testing.T) {
- // make a test impl object
- var mockedService = new(TestExampleImplementation)
- c := mockedService.On("TheExampleMethod")
- assert.Equal(t, []*Call{c}, mockedService.ExpectedCalls)
- assert.Equal(t, "TheExampleMethod", c.Method)
- }
- func Test_Mock_Chained_On(t *testing.T) {
- // make a test impl object
- var mockedService = new(TestExampleImplementation)
- mockedService.
- On("TheExampleMethod", 1, 2, 3).
- Return(0).
- On("TheExampleMethod3", AnythingOfType("*mock.ExampleType")).
- Return(nil)
- expectedCalls := []*Call{
- {
- Parent: &mockedService.Mock,
- Method: "TheExampleMethod",
- Arguments: []interface{}{1, 2, 3},
- ReturnArguments: []interface{}{0},
- },
- {
- Parent: &mockedService.Mock,
- Method: "TheExampleMethod3",
- Arguments: []interface{}{AnythingOfType("*mock.ExampleType")},
- ReturnArguments: []interface{}{nil},
- },
- }
- assert.Equal(t, expectedCalls, mockedService.ExpectedCalls)
- }
- func Test_Mock_On_WithArgs(t *testing.T) {
- // make a test impl object
- var mockedService = new(TestExampleImplementation)
- c := mockedService.On("TheExampleMethod", 1, 2, 3, 4)
- assert.Equal(t, []*Call{c}, mockedService.ExpectedCalls)
- assert.Equal(t, "TheExampleMethod", c.Method)
- assert.Equal(t, Arguments{1, 2, 3, 4}, c.Arguments)
- }
- func Test_Mock_On_WithFuncArg(t *testing.T) {
- // make a test impl object
- var mockedService = new(TestExampleImplementation)
- c := mockedService.
- On("TheExampleMethodFunc", AnythingOfType("func(string) error")).
- Return(nil)
- assert.Equal(t, []*Call{c}, mockedService.ExpectedCalls)
- assert.Equal(t, "TheExampleMethodFunc", c.Method)
- assert.Equal(t, 1, len(c.Arguments))
- assert.Equal(t, AnythingOfType("func(string) error"), c.Arguments[0])
- fn := func(string) error { return nil }
- assert.NotPanics(t, func() {
- mockedService.TheExampleMethodFunc(fn)
- })
- }
- func Test_Mock_On_WithIntArgMatcher(t *testing.T) {
- var mockedService TestExampleImplementation
- mockedService.On("TheExampleMethod",
- MatchedBy(func(a int) bool {
- return a == 1
- }), MatchedBy(func(b int) bool {
- return b == 2
- }), MatchedBy(func(c int) bool {
- return c == 3
- })).Return(0, nil)
- assert.Panics(t, func() {
- mockedService.TheExampleMethod(1, 2, 4)
- })
- assert.Panics(t, func() {
- mockedService.TheExampleMethod(2, 2, 3)
- })
- assert.NotPanics(t, func() {
- mockedService.TheExampleMethod(1, 2, 3)
- })
- }
- func Test_Mock_On_WithPtrArgMatcher(t *testing.T) {
- var mockedService TestExampleImplementation
- mockedService.On("TheExampleMethod3",
- MatchedBy(func(a *ExampleType) bool { return a != nil && a.ran == true }),
- ).Return(nil)
- mockedService.On("TheExampleMethod3",
- MatchedBy(func(a *ExampleType) bool { return a != nil && a.ran == false }),
- ).Return(errors.New("error"))
- mockedService.On("TheExampleMethod3",
- MatchedBy(func(a *ExampleType) bool { return a == nil }),
- ).Return(errors.New("error2"))
- assert.Equal(t, mockedService.TheExampleMethod3(&ExampleType{true}), nil)
- assert.EqualError(t, mockedService.TheExampleMethod3(&ExampleType{false}), "error")
- assert.EqualError(t, mockedService.TheExampleMethod3(nil), "error2")
- }
- func Test_Mock_On_WithFuncArgMatcher(t *testing.T) {
- var mockedService TestExampleImplementation
- fixture1, fixture2 := errors.New("fixture1"), errors.New("fixture2")
- mockedService.On("TheExampleMethodFunc",
- MatchedBy(func(a func(string) error) bool { return a != nil && a("string") == fixture1 }),
- ).Return(errors.New("fixture1"))
- mockedService.On("TheExampleMethodFunc",
- MatchedBy(func(a func(string) error) bool { return a != nil && a("string") == fixture2 }),
- ).Return(errors.New("fixture2"))
- mockedService.On("TheExampleMethodFunc",
- MatchedBy(func(a func(string) error) bool { return a == nil }),
- ).Return(errors.New("fixture3"))
- assert.EqualError(t, mockedService.TheExampleMethodFunc(
- func(string) error { return fixture1 }), "fixture1")
- assert.EqualError(t, mockedService.TheExampleMethodFunc(
- func(string) error { return fixture2 }), "fixture2")
- assert.EqualError(t, mockedService.TheExampleMethodFunc(nil), "fixture3")
- }
- func Test_Mock_On_WithInterfaceArgMatcher(t *testing.T) {
- var mockedService TestExampleImplementation
- mockedService.On("TheExampleMethod4",
- MatchedBy(func(a ExampleInterface) bool { return a == nil }),
- ).Return(errors.New("fixture1"))
- assert.EqualError(t, mockedService.TheExampleMethod4(nil), "fixture1")
- }
- func Test_Mock_On_WithChannelArgMatcher(t *testing.T) {
- var mockedService TestExampleImplementation
- mockedService.On("TheExampleMethod5",
- MatchedBy(func(ch chan struct{}) bool { return ch == nil }),
- ).Return(errors.New("fixture1"))
- assert.EqualError(t, mockedService.TheExampleMethod5(nil), "fixture1")
- }
- func Test_Mock_On_WithMapArgMatcher(t *testing.T) {
- var mockedService TestExampleImplementation
- mockedService.On("TheExampleMethod6",
- MatchedBy(func(m map[string]bool) bool { return m == nil }),
- ).Return(errors.New("fixture1"))
- assert.EqualError(t, mockedService.TheExampleMethod6(nil), "fixture1")
- }
- func Test_Mock_On_WithSliceArgMatcher(t *testing.T) {
- var mockedService TestExampleImplementation
- mockedService.On("TheExampleMethod7",
- MatchedBy(func(slice []bool) bool { return slice == nil }),
- ).Return(errors.New("fixture1"))
- assert.EqualError(t, mockedService.TheExampleMethod7(nil), "fixture1")
- }
- func Test_Mock_On_WithVariadicFunc(t *testing.T) {
- // make a test impl object
- var mockedService = new(TestExampleImplementation)
- c := mockedService.
- On("TheExampleMethodVariadic", []int{1, 2, 3}).
- Return(nil)
- assert.Equal(t, []*Call{c}, mockedService.ExpectedCalls)
- assert.Equal(t, 1, len(c.Arguments))
- assert.Equal(t, []int{1, 2, 3}, c.Arguments[0])
- assert.NotPanics(t, func() {
- mockedService.TheExampleMethodVariadic(1, 2, 3)
- })
- assert.Panics(t, func() {
- mockedService.TheExampleMethodVariadic(1, 2)
- })
- }
- func Test_Mock_On_WithMixedVariadicFunc(t *testing.T) {
- // make a test impl object
- var mockedService = new(TestExampleImplementation)
- c := mockedService.
- On("TheExampleMethodMixedVariadic", 1, []int{2, 3, 4}).
- Return(nil)
- assert.Equal(t, []*Call{c}, mockedService.ExpectedCalls)
- assert.Equal(t, 2, len(c.Arguments))
- assert.Equal(t, 1, c.Arguments[0])
- assert.Equal(t, []int{2, 3, 4}, c.Arguments[1])
- assert.NotPanics(t, func() {
- mockedService.TheExampleMethodMixedVariadic(1, 2, 3, 4)
- })
- assert.Panics(t, func() {
- mockedService.TheExampleMethodMixedVariadic(1, 2, 3, 5)
- })
- }
- func Test_Mock_On_WithVariadicFuncWithInterface(t *testing.T) {
- // make a test impl object
- var mockedService = new(TestExampleImplementation)
- c := mockedService.On("TheExampleMethodVariadicInterface", []interface{}{1, 2, 3}).
- Return(nil)
- assert.Equal(t, []*Call{c}, mockedService.ExpectedCalls)
- assert.Equal(t, 1, len(c.Arguments))
- assert.Equal(t, []interface{}{1, 2, 3}, c.Arguments[0])
- assert.NotPanics(t, func() {
- mockedService.TheExampleMethodVariadicInterface(1, 2, 3)
- })
- assert.Panics(t, func() {
- mockedService.TheExampleMethodVariadicInterface(1, 2)
- })
- }
- func Test_Mock_On_WithVariadicFuncWithEmptyInterfaceArray(t *testing.T) {
- // make a test impl object
- var mockedService = new(TestExampleImplementation)
- var expected []interface{}
- c := mockedService.
- On("TheExampleMethodVariadicInterface", expected).
- Return(nil)
- assert.Equal(t, []*Call{c}, mockedService.ExpectedCalls)
- assert.Equal(t, 1, len(c.Arguments))
- assert.Equal(t, expected, c.Arguments[0])
- assert.NotPanics(t, func() {
- mockedService.TheExampleMethodVariadicInterface()
- })
- assert.Panics(t, func() {
- mockedService.TheExampleMethodVariadicInterface(1, 2)
- })
- }
- func Test_Mock_On_WithFuncPanics(t *testing.T) {
- // make a test impl object
- var mockedService = new(TestExampleImplementation)
- assert.Panics(t, func() {
- mockedService.On("TheExampleMethodFunc", func(string) error { return nil })
- })
- }
- func Test_Mock_On_WithFuncTypeArg(t *testing.T) {
- // make a test impl object
- var mockedService = new(TestExampleImplementation)
- c := mockedService.
- On("TheExampleMethodFuncType", AnythingOfType("mock.ExampleFuncType")).
- Return(nil)
- assert.Equal(t, []*Call{c}, mockedService.ExpectedCalls)
- assert.Equal(t, 1, len(c.Arguments))
- assert.Equal(t, AnythingOfType("mock.ExampleFuncType"), c.Arguments[0])
- fn := func(string) error { return nil }
- assert.NotPanics(t, func() {
- mockedService.TheExampleMethodFuncType(fn)
- })
- }
- func Test_Mock_Return(t *testing.T) {
- // make a test impl object
- var mockedService = new(TestExampleImplementation)
- c := mockedService.
- On("TheExampleMethod", "A", "B", true).
- Return(1, "two", true)
- require.Equal(t, []*Call{c}, mockedService.ExpectedCalls)
- call := mockedService.ExpectedCalls[0]
- assert.Equal(t, "TheExampleMethod", call.Method)
- assert.Equal(t, "A", call.Arguments[0])
- assert.Equal(t, "B", call.Arguments[1])
- assert.Equal(t, true, call.Arguments[2])
- assert.Equal(t, 1, call.ReturnArguments[0])
- assert.Equal(t, "two", call.ReturnArguments[1])
- assert.Equal(t, true, call.ReturnArguments[2])
- assert.Equal(t, 0, call.Repeatability)
- assert.Nil(t, call.WaitFor)
- }
- func Test_Mock_Return_WaitUntil(t *testing.T) {
- // make a test impl object
- var mockedService = new(TestExampleImplementation)
- ch := time.After(time.Second)
- c := mockedService.Mock.
- On("TheExampleMethod", "A", "B", true).
- WaitUntil(ch).
- Return(1, "two", true)
- // assert that the call was created
- require.Equal(t, []*Call{c}, mockedService.ExpectedCalls)
- call := mockedService.ExpectedCalls[0]
- assert.Equal(t, "TheExampleMethod", call.Method)
- assert.Equal(t, "A", call.Arguments[0])
- assert.Equal(t, "B", call.Arguments[1])
- assert.Equal(t, true, call.Arguments[2])
- assert.Equal(t, 1, call.ReturnArguments[0])
- assert.Equal(t, "two", call.ReturnArguments[1])
- assert.Equal(t, true, call.ReturnArguments[2])
- assert.Equal(t, 0, call.Repeatability)
- assert.Equal(t, ch, call.WaitFor)
- }
- func Test_Mock_Return_After(t *testing.T) {
- // make a test impl object
- var mockedService = new(TestExampleImplementation)
- c := mockedService.Mock.
- On("TheExampleMethod", "A", "B", true).
- Return(1, "two", true).
- After(time.Second)
- require.Equal(t, []*Call{c}, mockedService.ExpectedCalls)
- call := mockedService.Mock.ExpectedCalls[0]
- assert.Equal(t, "TheExampleMethod", call.Method)
- assert.Equal(t, "A", call.Arguments[0])
- assert.Equal(t, "B", call.Arguments[1])
- assert.Equal(t, true, call.Arguments[2])
- assert.Equal(t, 1, call.ReturnArguments[0])
- assert.Equal(t, "two", call.ReturnArguments[1])
- assert.Equal(t, true, call.ReturnArguments[2])
- assert.Equal(t, 0, call.Repeatability)
- assert.NotEqual(t, nil, call.WaitFor)
- }
- func Test_Mock_Return_Run(t *testing.T) {
- // make a test impl object
- var mockedService = new(TestExampleImplementation)
- fn := func(args Arguments) {
- arg := args.Get(0).(*ExampleType)
- arg.ran = true
- }
- c := mockedService.Mock.
- On("TheExampleMethod3", AnythingOfType("*mock.ExampleType")).
- Return(nil).
- Run(fn)
- require.Equal(t, []*Call{c}, mockedService.ExpectedCalls)
- call := mockedService.Mock.ExpectedCalls[0]
- assert.Equal(t, "TheExampleMethod3", call.Method)
- assert.Equal(t, AnythingOfType("*mock.ExampleType"), call.Arguments[0])
- assert.Equal(t, nil, call.ReturnArguments[0])
- assert.Equal(t, 0, call.Repeatability)
- assert.NotEqual(t, nil, call.WaitFor)
- assert.NotNil(t, call.Run)
- et := ExampleType{}
- assert.Equal(t, false, et.ran)
- mockedService.TheExampleMethod3(&et)
- assert.Equal(t, true, et.ran)
- }
- func Test_Mock_Return_Run_Out_Of_Order(t *testing.T) {
- // make a test impl object
- var mockedService = new(TestExampleImplementation)
- f := func(args Arguments) {
- arg := args.Get(0).(*ExampleType)
- arg.ran = true
- }
- c := mockedService.Mock.
- On("TheExampleMethod3", AnythingOfType("*mock.ExampleType")).
- Run(f).
- Return(nil)
- require.Equal(t, []*Call{c}, mockedService.ExpectedCalls)
- call := mockedService.Mock.ExpectedCalls[0]
- assert.Equal(t, "TheExampleMethod3", call.Method)
- assert.Equal(t, AnythingOfType("*mock.ExampleType"), call.Arguments[0])
- assert.Equal(t, nil, call.ReturnArguments[0])
- assert.Equal(t, 0, call.Repeatability)
- assert.NotEqual(t, nil, call.WaitFor)
- assert.NotNil(t, call.Run)
- }
- func Test_Mock_Return_Once(t *testing.T) {
- // make a test impl object
- var mockedService = new(TestExampleImplementation)
- c := mockedService.On("TheExampleMethod", "A", "B", true).
- Return(1, "two", true).
- Once()
- require.Equal(t, []*Call{c}, mockedService.ExpectedCalls)
- call := mockedService.ExpectedCalls[0]
- assert.Equal(t, "TheExampleMethod", call.Method)
- assert.Equal(t, "A", call.Arguments[0])
- assert.Equal(t, "B", call.Arguments[1])
- assert.Equal(t, true, call.Arguments[2])
- assert.Equal(t, 1, call.ReturnArguments[0])
- assert.Equal(t, "two", call.ReturnArguments[1])
- assert.Equal(t, true, call.ReturnArguments[2])
- assert.Equal(t, 1, call.Repeatability)
- assert.Nil(t, call.WaitFor)
- }
- func Test_Mock_Return_Twice(t *testing.T) {
- // make a test impl object
- var mockedService = new(TestExampleImplementation)
- c := mockedService.
- On("TheExampleMethod", "A", "B", true).
- Return(1, "two", true).
- Twice()
- require.Equal(t, []*Call{c}, mockedService.ExpectedCalls)
- call := mockedService.ExpectedCalls[0]
- assert.Equal(t, "TheExampleMethod", call.Method)
- assert.Equal(t, "A", call.Arguments[0])
- assert.Equal(t, "B", call.Arguments[1])
- assert.Equal(t, true, call.Arguments[2])
- assert.Equal(t, 1, call.ReturnArguments[0])
- assert.Equal(t, "two", call.ReturnArguments[1])
- assert.Equal(t, true, call.ReturnArguments[2])
- assert.Equal(t, 2, call.Repeatability)
- assert.Nil(t, call.WaitFor)
- }
- func Test_Mock_Return_Times(t *testing.T) {
- // make a test impl object
- var mockedService = new(TestExampleImplementation)
- c := mockedService.
- On("TheExampleMethod", "A", "B", true).
- Return(1, "two", true).
- Times(5)
- require.Equal(t, []*Call{c}, mockedService.ExpectedCalls)
- call := mockedService.ExpectedCalls[0]
- assert.Equal(t, "TheExampleMethod", call.Method)
- assert.Equal(t, "A", call.Arguments[0])
- assert.Equal(t, "B", call.Arguments[1])
- assert.Equal(t, true, call.Arguments[2])
- assert.Equal(t, 1, call.ReturnArguments[0])
- assert.Equal(t, "two", call.ReturnArguments[1])
- assert.Equal(t, true, call.ReturnArguments[2])
- assert.Equal(t, 5, call.Repeatability)
- assert.Nil(t, call.WaitFor)
- }
- func Test_Mock_Return_Nothing(t *testing.T) {
- // make a test impl object
- var mockedService = new(TestExampleImplementation)
- c := mockedService.
- On("TheExampleMethod", "A", "B", true).
- Return()
- require.Equal(t, []*Call{c}, mockedService.ExpectedCalls)
- call := mockedService.ExpectedCalls[0]
- assert.Equal(t, "TheExampleMethod", call.Method)
- assert.Equal(t, "A", call.Arguments[0])
- assert.Equal(t, "B", call.Arguments[1])
- assert.Equal(t, true, call.Arguments[2])
- assert.Equal(t, 0, len(call.ReturnArguments))
- }
- func Test_Mock_findExpectedCall(t *testing.T) {
- m := new(Mock)
- m.On("One", 1).Return("one")
- m.On("Two", 2).Return("two")
- m.On("Two", 3).Return("three")
- f, c := m.findExpectedCall("Two", 3)
- if assert.Equal(t, 2, f) {
- if assert.NotNil(t, c) {
- assert.Equal(t, "Two", c.Method)
- assert.Equal(t, 3, c.Arguments[0])
- assert.Equal(t, "three", c.ReturnArguments[0])
- }
- }
- }
- func Test_Mock_findExpectedCall_For_Unknown_Method(t *testing.T) {
- m := new(Mock)
- m.On("One", 1).Return("one")
- m.On("Two", 2).Return("two")
- m.On("Two", 3).Return("three")
- f, _ := m.findExpectedCall("Two")
- assert.Equal(t, -1, f)
- }
- func Test_Mock_findExpectedCall_Respects_Repeatability(t *testing.T) {
- m := new(Mock)
- m.On("One", 1).Return("one")
- m.On("Two", 2).Return("two").Once()
- m.On("Two", 3).Return("three").Twice()
- m.On("Two", 3).Return("three").Times(8)
- f, c := m.findExpectedCall("Two", 3)
- if assert.Equal(t, 2, f) {
- if assert.NotNil(t, c) {
- assert.Equal(t, "Two", c.Method)
- assert.Equal(t, 3, c.Arguments[0])
- assert.Equal(t, "three", c.ReturnArguments[0])
- }
- }
- }
- func Test_callString(t *testing.T) {
- assert.Equal(t, `Method(int,bool,string)`, callString("Method", []interface{}{1, true, "something"}, false))
- }
- func Test_Mock_Called(t *testing.T) {
- var mockedService = new(TestExampleImplementation)
- mockedService.On("Test_Mock_Called", 1, 2, 3).Return(5, "6", true)
- returnArguments := mockedService.Called(1, 2, 3)
- if assert.Equal(t, 1, len(mockedService.Calls)) {
- assert.Equal(t, "Test_Mock_Called", mockedService.Calls[0].Method)
- assert.Equal(t, 1, mockedService.Calls[0].Arguments[0])
- assert.Equal(t, 2, mockedService.Calls[0].Arguments[1])
- assert.Equal(t, 3, mockedService.Calls[0].Arguments[2])
- }
- if assert.Equal(t, 3, len(returnArguments)) {
- assert.Equal(t, 5, returnArguments[0])
- assert.Equal(t, "6", returnArguments[1])
- assert.Equal(t, true, returnArguments[2])
- }
- }
- func asyncCall(m *Mock, ch chan Arguments) {
- ch <- m.Called(1, 2, 3)
- }
- func Test_Mock_Called_blocks(t *testing.T) {
- var mockedService = new(TestExampleImplementation)
- mockedService.Mock.On("asyncCall", 1, 2, 3).Return(5, "6", true).After(2 * time.Millisecond)
- ch := make(chan Arguments)
- go asyncCall(&mockedService.Mock, ch)
- select {
- case <-ch:
- t.Fatal("should have waited")
- case <-time.After(1 * time.Millisecond):
- }
- returnArguments := <-ch
- if assert.Equal(t, 1, len(mockedService.Mock.Calls)) {
- assert.Equal(t, "asyncCall", mockedService.Mock.Calls[0].Method)
- assert.Equal(t, 1, mockedService.Mock.Calls[0].Arguments[0])
- assert.Equal(t, 2, mockedService.Mock.Calls[0].Arguments[1])
- assert.Equal(t, 3, mockedService.Mock.Calls[0].Arguments[2])
- }
- if assert.Equal(t, 3, len(returnArguments)) {
- assert.Equal(t, 5, returnArguments[0])
- assert.Equal(t, "6", returnArguments[1])
- assert.Equal(t, true, returnArguments[2])
- }
- }
- func Test_Mock_Called_For_Bounded_Repeatability(t *testing.T) {
- var mockedService = new(TestExampleImplementation)
- mockedService.
- On("Test_Mock_Called_For_Bounded_Repeatability", 1, 2, 3).
- Return(5, "6", true).
- Once()
- mockedService.
- On("Test_Mock_Called_For_Bounded_Repeatability", 1, 2, 3).
- Return(-1, "hi", false)
- returnArguments1 := mockedService.Called(1, 2, 3)
- returnArguments2 := mockedService.Called(1, 2, 3)
- if assert.Equal(t, 2, len(mockedService.Calls)) {
- assert.Equal(t, "Test_Mock_Called_For_Bounded_Repeatability", mockedService.Calls[0].Method)
- assert.Equal(t, 1, mockedService.Calls[0].Arguments[0])
- assert.Equal(t, 2, mockedService.Calls[0].Arguments[1])
- assert.Equal(t, 3, mockedService.Calls[0].Arguments[2])
- assert.Equal(t, "Test_Mock_Called_For_Bounded_Repeatability", mockedService.Calls[1].Method)
- assert.Equal(t, 1, mockedService.Calls[1].Arguments[0])
- assert.Equal(t, 2, mockedService.Calls[1].Arguments[1])
- assert.Equal(t, 3, mockedService.Calls[1].Arguments[2])
- }
- if assert.Equal(t, 3, len(returnArguments1)) {
- assert.Equal(t, 5, returnArguments1[0])
- assert.Equal(t, "6", returnArguments1[1])
- assert.Equal(t, true, returnArguments1[2])
- }
- if assert.Equal(t, 3, len(returnArguments2)) {
- assert.Equal(t, -1, returnArguments2[0])
- assert.Equal(t, "hi", returnArguments2[1])
- assert.Equal(t, false, returnArguments2[2])
- }
- }
- func Test_Mock_Called_For_SetTime_Expectation(t *testing.T) {
- var mockedService = new(TestExampleImplementation)
- mockedService.On("TheExampleMethod", 1, 2, 3).Return(5, "6", true).Times(4)
- mockedService.TheExampleMethod(1, 2, 3)
- mockedService.TheExampleMethod(1, 2, 3)
- mockedService.TheExampleMethod(1, 2, 3)
- mockedService.TheExampleMethod(1, 2, 3)
- assert.Panics(t, func() {
- mockedService.TheExampleMethod(1, 2, 3)
- })
- }
- func Test_Mock_Called_Unexpected(t *testing.T) {
- var mockedService = new(TestExampleImplementation)
- // make sure it panics if no expectation was made
- assert.Panics(t, func() {
- mockedService.Called(1, 2, 3)
- }, "Calling unexpected method should panic")
- }
- func Test_AssertExpectationsForObjects_Helper(t *testing.T) {
- var mockedService1 = new(TestExampleImplementation)
- var mockedService2 = new(TestExampleImplementation)
- var mockedService3 = new(TestExampleImplementation)
- mockedService1.On("Test_AssertExpectationsForObjects_Helper", 1).Return()
- mockedService2.On("Test_AssertExpectationsForObjects_Helper", 2).Return()
- mockedService3.On("Test_AssertExpectationsForObjects_Helper", 3).Return()
- mockedService1.Called(1)
- mockedService2.Called(2)
- mockedService3.Called(3)
- assert.True(t, AssertExpectationsForObjects(t, &mockedService1.Mock, &mockedService2.Mock, &mockedService3.Mock))
- assert.True(t, AssertExpectationsForObjects(t, mockedService1, mockedService2, mockedService3))
- }
- func Test_AssertExpectationsForObjects_Helper_Failed(t *testing.T) {
- var mockedService1 = new(TestExampleImplementation)
- var mockedService2 = new(TestExampleImplementation)
- var mockedService3 = new(TestExampleImplementation)
- mockedService1.On("Test_AssertExpectationsForObjects_Helper_Failed", 1).Return()
- mockedService2.On("Test_AssertExpectationsForObjects_Helper_Failed", 2).Return()
- mockedService3.On("Test_AssertExpectationsForObjects_Helper_Failed", 3).Return()
- mockedService1.Called(1)
- mockedService3.Called(3)
- tt := new(testing.T)
- assert.False(t, AssertExpectationsForObjects(tt, &mockedService1.Mock, &mockedService2.Mock, &mockedService3.Mock))
- assert.False(t, AssertExpectationsForObjects(tt, mockedService1, mockedService2, mockedService3))
- }
- func Test_Mock_AssertExpectations(t *testing.T) {
- var mockedService = new(TestExampleImplementation)
- mockedService.On("Test_Mock_AssertExpectations", 1, 2, 3).Return(5, 6, 7)
- tt := new(testing.T)
- assert.False(t, mockedService.AssertExpectations(tt))
- // make the call now
- mockedService.Called(1, 2, 3)
- // now assert expectations
- assert.True(t, mockedService.AssertExpectations(tt))
- }
- func Test_Mock_AssertExpectations_Placeholder_NoArgs(t *testing.T) {
- var mockedService = new(TestExampleImplementation)
- mockedService.On("Test_Mock_AssertExpectations_Placeholder_NoArgs").Return(5, 6, 7).Once()
- mockedService.On("Test_Mock_AssertExpectations_Placeholder_NoArgs").Return(7, 6, 5)
- tt := new(testing.T)
- assert.False(t, mockedService.AssertExpectations(tt))
- // make the call now
- mockedService.Called()
- // now assert expectations
- assert.True(t, mockedService.AssertExpectations(tt))
- }
- func Test_Mock_AssertExpectations_Placeholder(t *testing.T) {
- var mockedService = new(TestExampleImplementation)
- mockedService.On("Test_Mock_AssertExpectations_Placeholder", 1, 2, 3).Return(5, 6, 7).Once()
- mockedService.On("Test_Mock_AssertExpectations_Placeholder", 3, 2, 1).Return(7, 6, 5)
- tt := new(testing.T)
- assert.False(t, mockedService.AssertExpectations(tt))
- // make the call now
- mockedService.Called(1, 2, 3)
- // now assert expectations
- assert.False(t, mockedService.AssertExpectations(tt))
- // make call to the second expectation
- mockedService.Called(3, 2, 1)
- // now assert expectations again
- assert.True(t, mockedService.AssertExpectations(tt))
- }
- func Test_Mock_AssertExpectations_With_Pointers(t *testing.T) {
- var mockedService = new(TestExampleImplementation)
- mockedService.On("Test_Mock_AssertExpectations_With_Pointers", &struct{ Foo int }{1}).Return(1)
- mockedService.On("Test_Mock_AssertExpectations_With_Pointers", &struct{ Foo int }{2}).Return(2)
- tt := new(testing.T)
- assert.False(t, mockedService.AssertExpectations(tt))
- s := struct{ Foo int }{1}
- // make the calls now
- mockedService.Called(&s)
- s.Foo = 2
- mockedService.Called(&s)
- // now assert expectations
- assert.True(t, mockedService.AssertExpectations(tt))
- }
- func Test_Mock_AssertExpectationsCustomType(t *testing.T) {
- var mockedService = new(TestExampleImplementation)
- mockedService.On("TheExampleMethod3", AnythingOfType("*mock.ExampleType")).Return(nil).Once()
- tt := new(testing.T)
- assert.False(t, mockedService.AssertExpectations(tt))
- // make the call now
- mockedService.TheExampleMethod3(&ExampleType{})
- // now assert expectations
- assert.True(t, mockedService.AssertExpectations(tt))
- }
- func Test_Mock_AssertExpectations_With_Repeatability(t *testing.T) {
- var mockedService = new(TestExampleImplementation)
- mockedService.On("Test_Mock_AssertExpectations_With_Repeatability", 1, 2, 3).Return(5, 6, 7).Twice()
- tt := new(testing.T)
- assert.False(t, mockedService.AssertExpectations(tt))
- // make the call now
- mockedService.Called(1, 2, 3)
- assert.False(t, mockedService.AssertExpectations(tt))
- mockedService.Called(1, 2, 3)
- // now assert expectations
- assert.True(t, mockedService.AssertExpectations(tt))
- }
- func Test_Mock_TwoCallsWithDifferentArguments(t *testing.T) {
- var mockedService = new(TestExampleImplementation)
- mockedService.On("Test_Mock_TwoCallsWithDifferentArguments", 1, 2, 3).Return(5, 6, 7)
- mockedService.On("Test_Mock_TwoCallsWithDifferentArguments", 4, 5, 6).Return(5, 6, 7)
- args1 := mockedService.Called(1, 2, 3)
- assert.Equal(t, 5, args1.Int(0))
- assert.Equal(t, 6, args1.Int(1))
- assert.Equal(t, 7, args1.Int(2))
- args2 := mockedService.Called(4, 5, 6)
- assert.Equal(t, 5, args2.Int(0))
- assert.Equal(t, 6, args2.Int(1))
- assert.Equal(t, 7, args2.Int(2))
- }
- func Test_Mock_AssertNumberOfCalls(t *testing.T) {
- var mockedService = new(TestExampleImplementation)
- mockedService.On("Test_Mock_AssertNumberOfCalls", 1, 2, 3).Return(5, 6, 7)
- mockedService.Called(1, 2, 3)
- assert.True(t, mockedService.AssertNumberOfCalls(t, "Test_Mock_AssertNumberOfCalls", 1))
- mockedService.Called(1, 2, 3)
- assert.True(t, mockedService.AssertNumberOfCalls(t, "Test_Mock_AssertNumberOfCalls", 2))
- }
- func Test_Mock_AssertCalled(t *testing.T) {
- var mockedService = new(TestExampleImplementation)
- mockedService.On("Test_Mock_AssertCalled", 1, 2, 3).Return(5, 6, 7)
- mockedService.Called(1, 2, 3)
- assert.True(t, mockedService.AssertCalled(t, "Test_Mock_AssertCalled", 1, 2, 3))
- }
- func Test_Mock_AssertCalled_WithAnythingOfTypeArgument(t *testing.T) {
- var mockedService = new(TestExampleImplementation)
- mockedService.
- On("Test_Mock_AssertCalled_WithAnythingOfTypeArgument", Anything, Anything, Anything).
- Return()
- mockedService.Called(1, "two", []uint8("three"))
- assert.True(t, mockedService.AssertCalled(t, "Test_Mock_AssertCalled_WithAnythingOfTypeArgument", AnythingOfType("int"), AnythingOfType("string"), AnythingOfType("[]uint8")))
- }
- func Test_Mock_AssertCalled_WithArguments(t *testing.T) {
- var mockedService = new(TestExampleImplementation)
- mockedService.On("Test_Mock_AssertCalled_WithArguments", 1, 2, 3).Return(5, 6, 7)
- mockedService.Called(1, 2, 3)
- tt := new(testing.T)
- assert.True(t, mockedService.AssertCalled(tt, "Test_Mock_AssertCalled_WithArguments", 1, 2, 3))
- assert.False(t, mockedService.AssertCalled(tt, "Test_Mock_AssertCalled_WithArguments", 2, 3, 4))
- }
- func Test_Mock_AssertCalled_WithArguments_With_Repeatability(t *testing.T) {
- var mockedService = new(TestExampleImplementation)
- mockedService.On("Test_Mock_AssertCalled_WithArguments_With_Repeatability", 1, 2, 3).Return(5, 6, 7).Once()
- mockedService.On("Test_Mock_AssertCalled_WithArguments_With_Repeatability", 2, 3, 4).Return(5, 6, 7).Once()
- mockedService.Called(1, 2, 3)
- mockedService.Called(2, 3, 4)
- tt := new(testing.T)
- assert.True(t, mockedService.AssertCalled(tt, "Test_Mock_AssertCalled_WithArguments_With_Repeatability", 1, 2, 3))
- assert.True(t, mockedService.AssertCalled(tt, "Test_Mock_AssertCalled_WithArguments_With_Repeatability", 2, 3, 4))
- assert.False(t, mockedService.AssertCalled(tt, "Test_Mock_AssertCalled_WithArguments_With_Repeatability", 3, 4, 5))
- }
- func Test_Mock_AssertNotCalled(t *testing.T) {
- var mockedService = new(TestExampleImplementation)
- mockedService.On("Test_Mock_AssertNotCalled", 1, 2, 3).Return(5, 6, 7)
- mockedService.Called(1, 2, 3)
- assert.True(t, mockedService.AssertNotCalled(t, "Test_Mock_NotCalled"))
- }
- func Test_Mock_AssertOptional(t *testing.T) {
- // Optional called
- var ms1 = new(TestExampleImplementation)
- ms1.On("TheExampleMethod", 1, 2, 3).Maybe().Return(4, nil)
- ms1.TheExampleMethod(1, 2, 3)
- tt1 := new(testing.T)
- assert.Equal(t, true, ms1.AssertExpectations(tt1))
- // Optional not called
- var ms2 = new(TestExampleImplementation)
- ms2.On("TheExampleMethod", 1, 2, 3).Maybe().Return(4, nil)
- tt2 := new(testing.T)
- assert.Equal(t, true, ms2.AssertExpectations(tt2))
- // Non-optional called
- var ms3 = new(TestExampleImplementation)
- ms3.On("TheExampleMethod", 1, 2, 3).Return(4, nil)
- ms3.TheExampleMethod(1, 2, 3)
- tt3 := new(testing.T)
- assert.Equal(t, true, ms3.AssertExpectations(tt3))
- }
- /*
- Arguments helper methods
- */
- func Test_Arguments_Get(t *testing.T) {
- var args = Arguments([]interface{}{"string", 123, true})
- assert.Equal(t, "string", args.Get(0).(string))
- assert.Equal(t, 123, args.Get(1).(int))
- assert.Equal(t, true, args.Get(2).(bool))
- }
- func Test_Arguments_Is(t *testing.T) {
- var args = Arguments([]interface{}{"string", 123, true})
- assert.True(t, args.Is("string", 123, true))
- assert.False(t, args.Is("wrong", 456, false))
- }
- func Test_Arguments_Diff(t *testing.T) {
- var args = Arguments([]interface{}{"Hello World", 123, true})
- var diff string
- var count int
- diff, count = args.Diff([]interface{}{"Hello World", 456, "false"})
- assert.Equal(t, 2, count)
- assert.Contains(t, diff, `%!s(int=456) != %!s(int=123)`)
- assert.Contains(t, diff, `false != %!s(bool=true)`)
- }
- func Test_Arguments_Diff_DifferentNumberOfArgs(t *testing.T) {
- var args = Arguments([]interface{}{"string", 123, true})
- var diff string
- var count int
- diff, count = args.Diff([]interface{}{"string", 456, "false", "extra"})
- assert.Equal(t, 3, count)
- assert.Contains(t, diff, `extra != (Missing)`)
- }
- func Test_Arguments_Diff_WithAnythingArgument(t *testing.T) {
- var args = Arguments([]interface{}{"string", 123, true})
- var count int
- _, count = args.Diff([]interface{}{"string", Anything, true})
- assert.Equal(t, 0, count)
- }
- func Test_Arguments_Diff_WithAnythingArgument_InActualToo(t *testing.T) {
- var args = Arguments([]interface{}{"string", Anything, true})
- var count int
- _, count = args.Diff([]interface{}{"string", 123, true})
- assert.Equal(t, 0, count)
- }
- func Test_Arguments_Diff_WithAnythingOfTypeArgument(t *testing.T) {
- var args = Arguments([]interface{}{"string", AnythingOfType("int"), true})
- var count int
- _, count = args.Diff([]interface{}{"string", 123, true})
- assert.Equal(t, 0, count)
- }
- func Test_Arguments_Diff_WithAnythingOfTypeArgument_Failing(t *testing.T) {
- var args = Arguments([]interface{}{"string", AnythingOfType("string"), true})
- var count int
- var diff string
- diff, count = args.Diff([]interface{}{"string", 123, true})
- assert.Equal(t, 1, count)
- assert.Contains(t, diff, `string != type int - %!s(int=123)`)
- }
- func Test_Arguments_Diff_WithArgMatcher(t *testing.T) {
- matchFn := func(a int) bool {
- return a == 123
- }
- var args = Arguments([]interface{}{"string", MatchedBy(matchFn), true})
- diff, count := args.Diff([]interface{}{"string", 124, true})
- assert.Equal(t, 1, count)
- assert.Contains(t, diff, `%!s(int=124) not matched by func(int) bool`)
- diff, count = args.Diff([]interface{}{"string", false, true})
- assert.Equal(t, 1, count)
- assert.Contains(t, diff, `%!s(bool=false) not matched by func(int) bool`)
- diff, count = args.Diff([]interface{}{"string", 123, false})
- assert.Contains(t, diff, `%!s(int=123) matched by func(int) bool`)
- diff, count = args.Diff([]interface{}{"string", 123, true})
- assert.Equal(t, 0, count)
- assert.Contains(t, diff, `No differences.`)
- }
- func Test_Arguments_Assert(t *testing.T) {
- var args = Arguments([]interface{}{"string", 123, true})
- assert.True(t, args.Assert(t, "string", 123, true))
- }
- func Test_Arguments_String_Representation(t *testing.T) {
- var args = Arguments([]interface{}{"string", 123, true})
- assert.Equal(t, `string,int,bool`, args.String())
- }
- func Test_Arguments_String(t *testing.T) {
- var args = Arguments([]interface{}{"string", 123, true})
- assert.Equal(t, "string", args.String(0))
- }
- func Test_Arguments_Error(t *testing.T) {
- var err = errors.New("An Error")
- var args = Arguments([]interface{}{"string", 123, true, err})
- assert.Equal(t, err, args.Error(3))
- }
- func Test_Arguments_Error_Nil(t *testing.T) {
- var args = Arguments([]interface{}{"string", 123, true, nil})
- assert.Equal(t, nil, args.Error(3))
- }
- func Test_Arguments_Int(t *testing.T) {
- var args = Arguments([]interface{}{"string", 123, true})
- assert.Equal(t, 123, args.Int(1))
- }
- func Test_Arguments_Bool(t *testing.T) {
- var args = Arguments([]interface{}{"string", 123, true})
- assert.Equal(t, true, args.Bool(2))
- }
- func Test_WaitUntil_Parallel(t *testing.T) {
- // make a test impl object
- var mockedService *TestExampleImplementation = new(TestExampleImplementation)
- ch1 := make(chan time.Time)
- ch2 := make(chan time.Time)
- mockedService.Mock.On("TheExampleMethod2", true).Return().WaitUntil(ch2).Run(func(args Arguments) {
- ch1 <- time.Now()
- })
- mockedService.Mock.On("TheExampleMethod2", false).Return().WaitUntil(ch1)
- // Lock both goroutines on the .WaitUntil method
- go func() {
- mockedService.TheExampleMethod2(false)
- }()
- go func() {
- mockedService.TheExampleMethod2(true)
- }()
- // Allow the first call to execute, so the second one executes afterwards
- ch2 <- time.Now()
- }
- func Test_MockMethodCalled(t *testing.T) {
- m := new(Mock)
- m.On("foo", "hello").Return("world")
- retArgs := m.MethodCalled("foo", "hello")
- require.True(t, len(retArgs) == 1)
- require.Equal(t, "world", retArgs[0])
- m.AssertExpectations(t)
- }
- // Test to validate fix for racy concurrent call access in MethodCalled()
- func Test_MockReturnAndCalledConcurrent(t *testing.T) {
- iterations := 1000
- m := &Mock{}
- call := m.On("ConcurrencyTestMethod")
- wg := sync.WaitGroup{}
- wg.Add(2)
- go func() {
- for i := 0; i < iterations; i++ {
- call.Return(10)
- }
- wg.Done()
- }()
- go func() {
- for i := 0; i < iterations; i++ {
- ConcurrencyTestMethod(m)
- }
- wg.Done()
- }()
- wg.Wait()
- }
- type timer struct{ Mock }
- func (s *timer) GetTime(i int) string {
- return s.Called(i).Get(0).(string)
- }
- func TestAfterTotalWaitTimeWhileExecution(t *testing.T) {
- waitDuration := 1
- total, waitMs := 5, time.Millisecond*time.Duration(waitDuration)
- aTimer := new(timer)
- for i := 0; i < total; i++ {
- aTimer.On("GetTime", i).After(waitMs).Return(fmt.Sprintf("Time%d", i)).Once()
- }
- time.Sleep(waitMs)
- start := time.Now()
- var results []string
- for i := 0; i < total; i++ {
- results = append(results, aTimer.GetTime(i))
- }
- end := time.Now()
- elapsedTime := end.Sub(start)
- assert.True(t, elapsedTime > waitMs, fmt.Sprintf("Total elapsed time:%v should be atleast greater than %v", elapsedTime, waitMs))
- assert.Equal(t, total, len(results))
- for i := range results {
- assert.Equal(t, fmt.Sprintf("Time%d", i), results[i], "Return value of method should be same")
- }
- }
- func ConcurrencyTestMethod(m *Mock) {
- m.Called()
- }
|