- Mocks Aren’t Stubs
- What’s the difference between a mock & stub?
- Mocking vs. Spying in mocking frameworks
- Mocking and stubbing in Ruby on Rails
- What’s the difference between faking, mocking, and stubbing?
After going through all the above pages, I could arrive at following definitions:
Mocking is a unit testing phenomenon which is used to replace real objects with test objects that mocks the behavior. These test objects are called as Mock objects. The point to note is that mock objects are not coded in advance with pre-determined return results. On the other hand, they are created at run-time with set expectations which are later verified after the execution of the tests. Tests written with mock objects follow following pattern:
- Initialize mocks
- Set expectations
- Execute the tests
- Verify whether one or more methods got executed as expected
The primary reason for using mocking is to eliminate testing all the dependencies of a class or function so your tests are more focused and simpler.
Stubbing, on the other hand, is used to replace real objects with test objects that are coded in advance with predefined behavior and return canned results. Those working with dependency injection frameworks such as Spring finds it very easy to inject stubs in place of real objects while doing unit testing. Stubs may also be used to record some data around testing which is not possible with mock objects. This is also one of the key reason why one may want to go with stubbing in some cases rather than mocking. However, unlike mock objects, Stubs could not be used to verify interactions and related behavior.
Spying is a mocking concept which is used to do partial mocking. Spying is used in the cases when there is a need to mock only few methods of the class, primarily due to the reason that execution of these methods would have one or more side effects. Spying is recommended mainly in the case of legacy code.