ThreadingMock._increment_mock_call() was not thread-safe.
Multiple threads calling the mock simultaneously could lose
increments due to race conditions on call_count and other
attributes.
Fix by overriding _increment_mock_call in ThreadingMixin
and wrapping it with the existing _mock_calls_events_lock.
return ret_value
+ def _increment_mock_call(self, /, *args, **kwargs):
+ with self._mock_calls_events_lock:
+ super()._increment_mock_call(*args, **kwargs)
+
def wait_until_called(self, *, timeout=_timeout_unset):
"""Wait until the mock object is called.
--- /dev/null
+Fix race condition in :class:`unittest.mock.ThreadingMock` where
+concurrent calls could lose increments to ``call_count`` and other
+attributes due to a missing lock in ``_increment_mock_call``.