Sobes.tech
Junior

What is mocking in the context of testing?

sobes.tech AI

Answer from AI

Mocking is the creation of mock objects that imitate the behavior of real dependencies of the tested object. This is done to isolate the tested component and verify its logic without interacting with external subsystems (databases, network services, etc.). Mocks allow controlling return values and exceptions, as well as checking how the tested object interacts with its dependencies (whether certain methods were called with specific arguments).

Why mocking is needed:

  • Isolation: Only the logic of the component under test is tested.
  • Speed: Mocking dependencies allows tests to run quickly without waiting for responses from external services.
  • Reliability: Tests do not depend on the state of external systems, making them more stable.
  • Testing boundary cases: It is easy to simulate errors or unexpected behavior of dependencies.

Popular mocking libraries in Python:

  • unittest.mock: Built-in module in the standard library.
  • pytest-mock: Plugin for pytest providing a convenient fixture mocker.

Example of using unittest.mock:

# Source code
class Service:
    def get_data(self):
        # Request to external service
        pass

class Processor:
    def __init__(self, service):
        self._service = service

    def process(self):
        data = self._service.get_data()
        return f"Processed: {data}"

# Mocking for testing Processor
import unittest
from unittest.mock import Mock

class TestProcessor(unittest.TestCase):
    def test_process_calls_service(self):
        # Create a mock for Service
        mock_service = Mock()
        # Specify what value get_data should return
        mock_service.get_data.return_value = "Test data"

        # Create the object under test with the mock
        processor = Processor(mock_service)
        result = processor.process()

        # Check that get_data was called
        mock_service.get_data.assert_called_once()
        # Check the result
        self.assertEqual(result, "Processed: Test data")

if __name__ == '__main__':
    unittest.main()