diff --git a/requirements.txt b/requirements.txt
index 5f21a2d521496e2dea600d6d73768c9fe966a1bc..c89e16b0dec9bd79da8bd56cd430b2c0eaba8bd4 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -4,4 +4,4 @@ python-magic
 pyyaml
 requests
 sentry-sdk >= 2
-tenacity
+tenacity >= 8.4.2
diff --git a/swh/core/tests/test_retry.py b/swh/core/tests/test_retry.py
index f976384b6a6f5ddc027e4fdc32260baa84454199..3875d03666413fde62de0b828ac47612e0179f38 100644
--- a/swh/core/tests/test_retry.py
+++ b/swh/core/tests/test_retry.py
@@ -1,8 +1,9 @@
-# Copyright (C) 2023  The Software Heritage developers
+# Copyright (C) 2023-2024  The Software Heritage developers
 # See the AUTHORS file at the top-level directory of this distribution
 # License: GNU General Public License version 3, or any later version
 # See top-level LICENSE file for more information
 
+
 import pytest
 import requests
 from requests.status_codes import codes
@@ -20,6 +21,11 @@ def make_request():
     return response
 
 
+@pytest.fixture
+def mock_sleep(mocker):
+    return mocker.patch("time.sleep")
+
+
 def assert_sleep_calls(mocker, mock_sleep, sleep_params):
     mock_sleep.assert_has_calls([mocker.call(param) for param in sleep_params])
 
@@ -33,7 +39,7 @@ def assert_sleep_calls(mocker, mock_sleep, sleep_params):
         codes.service_unavailable,
     ],
 )
-def test_http_retry(requests_mock, mocker, status_code):
+def test_http_retry(requests_mock, mocker, mock_sleep, status_code):
     data = {"result": {}}
     requests_mock.get(
         TEST_URL,
@@ -44,8 +50,6 @@ def test_http_retry(requests_mock, mocker, status_code):
         ],
     )
 
-    mock_sleep = mocker.patch.object(make_request.retry, "sleep")
-
     response = make_request()
 
     assert_sleep_calls(mocker, mock_sleep, [1, WAIT_EXP_BASE])
@@ -53,14 +57,12 @@ def test_http_retry(requests_mock, mocker, status_code):
     assert response.json() == data
 
 
-def test_http_retry_max_attemps(requests_mock, mocker):
+def test_http_retry_max_attemps(requests_mock, mocker, mock_sleep):
     requests_mock.get(
         TEST_URL,
         [{"status_code": codes.too_many_requests}] * (MAX_NUMBER_ATTEMPTS),
     )
 
-    mock_sleep = mocker.patch.object(make_request.retry, "sleep")
-
     with pytest.raises(requests.exceptions.HTTPError) as e:
         make_request()
 
@@ -80,7 +82,7 @@ def make_request_wait_fixed():
     return response
 
 
-def test_http_retry_wait_fixed(requests_mock, mocker):
+def test_http_retry_wait_fixed(requests_mock, mocker, mock_sleep):
     requests_mock.get(
         TEST_URL,
         [
@@ -90,8 +92,6 @@ def test_http_retry_wait_fixed(requests_mock, mocker):
         ],
     )
 
-    mock_sleep = mocker.patch.object(make_request_wait_fixed.retry, "sleep")
-
     make_request_wait_fixed()
 
     assert_sleep_calls(mocker, mock_sleep, [WAIT_EXP_BASE] * 2)