mock_test.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418
  1. package mock
  2. import (
  3. "errors"
  4. "github.com/stretchr/testify/assert"
  5. "testing"
  6. )
  7. /*
  8. Test objects
  9. */
  10. // ExampleInterface represents an example interface.
  11. type ExampleInterface interface {
  12. TheExampleMethod(a, b, c int) (int, error)
  13. }
  14. // TestExampleImplementation is a test implementation of ExampleInterface
  15. type TestExampleImplementation struct {
  16. Mock
  17. }
  18. func (i *TestExampleImplementation) TheExampleMethod(a, b, c int) (int, error) {
  19. args := i.Mock.Called(a, b, c)
  20. return args.Int(0), args.Error(1)
  21. }
  22. func (i *TestExampleImplementation) TheExampleMethod2(yesorno bool) {
  23. i.Mock.Called(yesorno)
  24. }
  25. /*
  26. Mock
  27. */
  28. func Test_Mock_TestData(t *testing.T) {
  29. var mockedService *TestExampleImplementation = new(TestExampleImplementation)
  30. if assert.NotNil(t, mockedService.TestData()) {
  31. mockedService.TestData().Set("something", 123)
  32. assert.Equal(t, 123, mockedService.TestData().Get("something").Data())
  33. }
  34. }
  35. func Test_Mock_On(t *testing.T) {
  36. // make a test impl object
  37. var mockedService *TestExampleImplementation = new(TestExampleImplementation)
  38. assert.Equal(t, mockedService.Mock.On("TheExampleMethod"), &mockedService.Mock)
  39. assert.Equal(t, "TheExampleMethod", mockedService.Mock.onMethodName)
  40. }
  41. func Test_Mock_On_WithArgs(t *testing.T) {
  42. // make a test impl object
  43. var mockedService *TestExampleImplementation = new(TestExampleImplementation)
  44. assert.Equal(t, mockedService.Mock.On("TheExampleMethod", 1, 2, 3), &mockedService.Mock)
  45. assert.Equal(t, "TheExampleMethod", mockedService.Mock.onMethodName)
  46. assert.Equal(t, 1, mockedService.Mock.onMethodArguments[0])
  47. assert.Equal(t, 2, mockedService.Mock.onMethodArguments[1])
  48. assert.Equal(t, 3, mockedService.Mock.onMethodArguments[2])
  49. }
  50. func Test_Mock_Return(t *testing.T) {
  51. // make a test impl object
  52. var mockedService *TestExampleImplementation = new(TestExampleImplementation)
  53. assert.Equal(t, mockedService.Mock.On("TheExampleMethod", "A", "B", true).Return(1, "two", true), &mockedService.Mock)
  54. // ensure the call was created
  55. if assert.Equal(t, 1, len(mockedService.Mock.ExpectedCalls)) {
  56. call := mockedService.Mock.ExpectedCalls[0]
  57. assert.Equal(t, "TheExampleMethod", call.Method)
  58. assert.Equal(t, "A", call.Arguments[0])
  59. assert.Equal(t, "B", call.Arguments[1])
  60. assert.Equal(t, true, call.Arguments[2])
  61. assert.Equal(t, 1, call.ReturnArguments[0])
  62. assert.Equal(t, "two", call.ReturnArguments[1])
  63. assert.Equal(t, true, call.ReturnArguments[2])
  64. }
  65. }
  66. func Test_Mock_Return_Nothing(t *testing.T) {
  67. // make a test impl object
  68. var mockedService *TestExampleImplementation = new(TestExampleImplementation)
  69. assert.Equal(t, mockedService.Mock.On("TheExampleMethod", "A", "B", true).Return(), &mockedService.Mock)
  70. // ensure the call was created
  71. if assert.Equal(t, 1, len(mockedService.Mock.ExpectedCalls)) {
  72. call := mockedService.Mock.ExpectedCalls[0]
  73. assert.Equal(t, "TheExampleMethod", call.Method)
  74. assert.Equal(t, "A", call.Arguments[0])
  75. assert.Equal(t, "B", call.Arguments[1])
  76. assert.Equal(t, true, call.Arguments[2])
  77. assert.Equal(t, 0, len(call.ReturnArguments))
  78. }
  79. }
  80. func Test_Mock_findExpectedCall(t *testing.T) {
  81. m := new(Mock)
  82. m.On("One", 1).Return("one")
  83. m.On("Two", 2).Return("two")
  84. m.On("Two", 3).Return("three")
  85. f, c := m.findExpectedCall("Two", 3)
  86. if assert.True(t, f) {
  87. if assert.NotNil(t, c) {
  88. assert.Equal(t, "Two", c.Method)
  89. assert.Equal(t, 3, c.Arguments[0])
  90. assert.Equal(t, "three", c.ReturnArguments[0])
  91. }
  92. }
  93. }
  94. func Test_callString(t *testing.T) {
  95. assert.Equal(t, `Method(int,bool,string)`, callString("Method", []interface{}{1, true, "something"}, false))
  96. }
  97. func Test_Mock_Called(t *testing.T) {
  98. var mockedService *TestExampleImplementation = new(TestExampleImplementation)
  99. mockedService.Mock.On("Test_Mock_Called", 1, 2, 3).Return(5, "6", true)
  100. returnArguments := mockedService.Mock.Called(1, 2, 3)
  101. if assert.Equal(t, 1, len(mockedService.Mock.Calls)) {
  102. assert.Equal(t, "Test_Mock_Called", mockedService.Mock.Calls[0].Method)
  103. assert.Equal(t, 1, mockedService.Mock.Calls[0].Arguments[0])
  104. assert.Equal(t, 2, mockedService.Mock.Calls[0].Arguments[1])
  105. assert.Equal(t, 3, mockedService.Mock.Calls[0].Arguments[2])
  106. }
  107. if assert.Equal(t, 3, len(returnArguments)) {
  108. assert.Equal(t, 5, returnArguments[0])
  109. assert.Equal(t, "6", returnArguments[1])
  110. assert.Equal(t, true, returnArguments[2])
  111. }
  112. }
  113. func Test_Mock_Called_Unexpected(t *testing.T) {
  114. var mockedService *TestExampleImplementation = new(TestExampleImplementation)
  115. // make sure it panics if no expectation was made
  116. assert.Panics(t, func() {
  117. mockedService.Mock.Called(1, 2, 3)
  118. }, "Calling unexpected method should panic")
  119. }
  120. func Test_AssertExpectationsForObjects_Helper(t *testing.T) {
  121. var mockedService1 *TestExampleImplementation = new(TestExampleImplementation)
  122. var mockedService2 *TestExampleImplementation = new(TestExampleImplementation)
  123. var mockedService3 *TestExampleImplementation = new(TestExampleImplementation)
  124. mockedService1.Mock.On("Test_AssertExpectationsForObjects_Helper", 1).Return()
  125. mockedService2.Mock.On("Test_AssertExpectationsForObjects_Helper", 2).Return()
  126. mockedService3.Mock.On("Test_AssertExpectationsForObjects_Helper", 3).Return()
  127. mockedService1.Called(1)
  128. mockedService2.Called(2)
  129. mockedService3.Called(3)
  130. assert.True(t, AssertExpectationsForObjects(t, mockedService1.Mock, mockedService2.Mock, mockedService3.Mock))
  131. }
  132. func Test_AssertExpectationsForObjects_Helper_Failed(t *testing.T) {
  133. var mockedService1 *TestExampleImplementation = new(TestExampleImplementation)
  134. var mockedService2 *TestExampleImplementation = new(TestExampleImplementation)
  135. var mockedService3 *TestExampleImplementation = new(TestExampleImplementation)
  136. mockedService1.Mock.On("Test_AssertExpectationsForObjects_Helper_Failed", 1).Return()
  137. mockedService2.Mock.On("Test_AssertExpectationsForObjects_Helper_Failed", 2).Return()
  138. mockedService3.Mock.On("Test_AssertExpectationsForObjects_Helper_Failed", 3).Return()
  139. mockedService1.Called(1)
  140. mockedService3.Called(3)
  141. tt := new(testing.T)
  142. assert.False(t, AssertExpectationsForObjects(tt, mockedService1.Mock, mockedService2.Mock, mockedService3.Mock))
  143. }
  144. func Test_Mock_AssertExpectations(t *testing.T) {
  145. var mockedService *TestExampleImplementation = new(TestExampleImplementation)
  146. mockedService.Mock.On("Test_Mock_AssertExpectations", 1, 2, 3).Return(5, 6, 7)
  147. tt := new(testing.T)
  148. assert.False(t, mockedService.AssertExpectations(tt))
  149. // make the call now
  150. mockedService.Mock.Called(1, 2, 3)
  151. // now assert expectations
  152. assert.True(t, mockedService.AssertExpectations(tt))
  153. }
  154. func Test_Mock_AssertNumberOfCalls(t *testing.T) {
  155. var mockedService *TestExampleImplementation = new(TestExampleImplementation)
  156. mockedService.Mock.On("Test_Mock_AssertNumberOfCalls", 1, 2, 3).Return(5, 6, 7)
  157. mockedService.Mock.Called(1, 2, 3)
  158. assert.True(t, mockedService.AssertNumberOfCalls(t, "Test_Mock_AssertNumberOfCalls", 1))
  159. mockedService.Mock.Called(1, 2, 3)
  160. assert.True(t, mockedService.AssertNumberOfCalls(t, "Test_Mock_AssertNumberOfCalls", 2))
  161. }
  162. func Test_Mock_AssertCalled(t *testing.T) {
  163. var mockedService *TestExampleImplementation = new(TestExampleImplementation)
  164. mockedService.Mock.On("Test_Mock_AssertCalled", 1, 2, 3).Return(5, 6, 7)
  165. mockedService.Mock.Called(1, 2, 3)
  166. assert.True(t, mockedService.AssertCalled(t, "Test_Mock_AssertCalled", 1, 2, 3))
  167. }
  168. func Test_Mock_AssertCalled_WithArguments(t *testing.T) {
  169. var mockedService *TestExampleImplementation = new(TestExampleImplementation)
  170. mockedService.Mock.On("Test_Mock_AssertCalled_WithArguments", 1, 2, 3).Return(5, 6, 7)
  171. mockedService.Mock.Called(1, 2, 3)
  172. tt := new(testing.T)
  173. assert.True(t, mockedService.AssertCalled(tt, "Test_Mock_AssertCalled_WithArguments", 1, 2, 3))
  174. assert.False(t, mockedService.AssertCalled(tt, "Test_Mock_AssertCalled_WithArguments", 2, 3, 4))
  175. }
  176. func Test_Mock_AssertNotCalled(t *testing.T) {
  177. var mockedService *TestExampleImplementation = new(TestExampleImplementation)
  178. mockedService.Mock.On("Test_Mock_AssertNotCalled", 1, 2, 3).Return(5, 6, 7)
  179. mockedService.Mock.Called(1, 2, 3)
  180. assert.True(t, mockedService.AssertNotCalled(t, "Test_Mock_NotCalled"))
  181. }
  182. /*
  183. Arguments helper methods
  184. */
  185. func Test_Arguments_Get(t *testing.T) {
  186. var args Arguments = []interface{}{"string", 123, true}
  187. assert.Equal(t, "string", args.Get(0).(string))
  188. assert.Equal(t, 123, args.Get(1).(int))
  189. assert.Equal(t, true, args.Get(2).(bool))
  190. }
  191. func Test_Arguments_Is(t *testing.T) {
  192. var args Arguments = []interface{}{"string", 123, true}
  193. assert.True(t, args.Is("string", 123, true))
  194. assert.False(t, args.Is("wrong", 456, false))
  195. }
  196. func Test_Arguments_Diff(t *testing.T) {
  197. var args Arguments = []interface{}{"Hello World", 123, true}
  198. var diff string
  199. var count int
  200. diff, count = args.Diff([]interface{}{"Hello World", 456, "false"})
  201. assert.Equal(t, 2, count)
  202. assert.Contains(t, diff, `%!s(int=456) != %!s(int=123)`)
  203. assert.Contains(t, diff, `false != %!s(bool=true)`)
  204. }
  205. func Test_Arguments_Diff_DifferentNumberOfArgs(t *testing.T) {
  206. var args Arguments = []interface{}{"string", 123, true}
  207. var diff string
  208. var count int
  209. diff, count = args.Diff([]interface{}{"string", 456, "false", "extra"})
  210. assert.Equal(t, 3, count)
  211. assert.Contains(t, diff, `extra != (Missing)`)
  212. }
  213. func Test_Arguments_Diff_WithAnythingArgument(t *testing.T) {
  214. var args Arguments = []interface{}{"string", 123, true}
  215. var count int
  216. _, count = args.Diff([]interface{}{"string", Anything, true})
  217. assert.Equal(t, 0, count)
  218. }
  219. func Test_Arguments_Diff_WithAnythingArgument_InActualToo(t *testing.T) {
  220. var args Arguments = []interface{}{"string", Anything, true}
  221. var count int
  222. _, count = args.Diff([]interface{}{"string", 123, true})
  223. assert.Equal(t, 0, count)
  224. }
  225. func Test_Arguments_Diff_WithAnythingOfTypeArgument(t *testing.T) {
  226. var args Arguments = []interface{}{"string", 123, true}
  227. var count int
  228. _, count = args.Diff([]interface{}{"string", AnythingOfType("int"), true})
  229. assert.Equal(t, 0, count)
  230. }
  231. func Test_Arguments_Diff_WithAnythingOfTypeArgument_Failing(t *testing.T) {
  232. var args Arguments = []interface{}{"string", 123, true}
  233. var count int
  234. var diff string
  235. diff, count = args.Diff([]interface{}{"string", AnythingOfType("string"), true})
  236. assert.Equal(t, 1, count)
  237. assert.Contains(t, diff, `string != type int - %!s(int=123)`)
  238. }
  239. func Test_Arguments_Assert(t *testing.T) {
  240. var args Arguments = []interface{}{"string", 123, true}
  241. assert.True(t, args.Assert(t, "string", 123, true))
  242. }
  243. func Test_Arguments_String_Representation(t *testing.T) {
  244. var args Arguments = []interface{}{"string", 123, true}
  245. assert.Equal(t, `string,int,bool`, args.String())
  246. }
  247. func Test_Arguments_String(t *testing.T) {
  248. var args Arguments = []interface{}{"string", 123, true}
  249. assert.Equal(t, "string", args.String(0))
  250. }
  251. func Test_Arguments_Error(t *testing.T) {
  252. var err error = errors.New("An Error")
  253. var args Arguments = []interface{}{"string", 123, true, err}
  254. assert.Equal(t, err, args.Error(3))
  255. }
  256. func Test_Arguments_Error_Nil(t *testing.T) {
  257. var args Arguments = []interface{}{"string", 123, true, nil}
  258. assert.Equal(t, nil, args.Error(3))
  259. }
  260. func Test_Arguments_Int(t *testing.T) {
  261. var args Arguments = []interface{}{"string", 123, true}
  262. assert.Equal(t, 123, args.Int(1))
  263. }
  264. func Test_Arguments_Bool(t *testing.T) {
  265. var args Arguments = []interface{}{"string", 123, true}
  266. assert.Equal(t, true, args.Bool(2))
  267. }