diff --git a/ee/spec/frontend/monitoring/alert_widget_spec.js b/ee/spec/frontend/monitoring/alert_widget_spec.js
index 12283d7b1a9f849f42c1d8e3b23e82655deffdaf..903652a5e6deee85cbdd3680d331cbd42f70b743 100644
--- a/ee/spec/frontend/monitoring/alert_widget_spec.js
+++ b/ee/spec/frontend/monitoring/alert_widget_spec.js
@@ -62,7 +62,6 @@ describe('AlertWidget', () => {
   const findCurrentSettings = () => wrapper.find('.alert-current-setting');
 
   afterEach(() => {
-    jest.clearAllMocks();
     wrapper.destroy();
     wrapper = null;
   });
diff --git a/ee/spec/frontend/projects/merge_requests/blocking_mr_input_spec.js b/ee/spec/frontend/projects/merge_requests/blocking_mr_input_spec.js
index d23d11d15e7b80b844c75da45a5c104fd81e6aff..d09e877c443f906ca63230488c003fc23b9d239b 100644
--- a/ee/spec/frontend/projects/merge_requests/blocking_mr_input_spec.js
+++ b/ee/spec/frontend/projects/merge_requests/blocking_mr_input_spec.js
@@ -22,7 +22,6 @@ describe('BlockingMrInput', () => {
 
   afterEach(() => {
     document.querySelector('#test').remove();
-    jest.clearAllMocks();
   });
 
   it('adds hidden references block when hidden count is greater than 0', () => {
diff --git a/ee/spec/frontend/security_dashboard/components/project_manager_spec.js b/ee/spec/frontend/security_dashboard/components/project_manager_spec.js
index fdd745a34c00f252bf366463188052573bcf7a35..96db4a4831e5fe294c7a77429887326fd4362c53 100644
--- a/ee/spec/frontend/security_dashboard/components/project_manager_spec.js
+++ b/ee/spec/frontend/security_dashboard/components/project_manager_spec.js
@@ -66,7 +66,6 @@ describe('Project Manager component', () => {
 
   afterEach(() => {
     wrapper.destroy();
-    jest.clearAllMocks();
   });
 
   describe('given the default state', () => {
diff --git a/ee/spec/frontend/security_dashboard/store/modules/project_selector/actions_spec.js b/ee/spec/frontend/security_dashboard/store/modules/project_selector/actions_spec.js
index aab263f23e3099a5f0b525d14a7c0631424b84b8..86cc8b30c5163e4cae7d70cfaf5bc7a11f4edfaa 100644
--- a/ee/spec/frontend/security_dashboard/store/modules/project_selector/actions_spec.js
+++ b/ee/spec/frontend/security_dashboard/store/modules/project_selector/actions_spec.js
@@ -29,7 +29,6 @@ describe('projectSelector actions', () => {
   });
 
   afterEach(() => {
-    jest.clearAllMocks();
     mockAxios.restore();
   });
 
diff --git a/ee/spec/frontend/security_dashboard/store/modules/vulnerable_projects/actions_spec.js b/ee/spec/frontend/security_dashboard/store/modules/vulnerable_projects/actions_spec.js
index a1a8447c1b15f83f743632db519397458fb00007..e85b66cb80f1a93e42c57057fb0bbbb6db91eeb8 100644
--- a/ee/spec/frontend/security_dashboard/store/modules/vulnerable_projects/actions_spec.js
+++ b/ee/spec/frontend/security_dashboard/store/modules/vulnerable_projects/actions_spec.js
@@ -24,10 +24,6 @@ describe('Vulnerable Projects actions', () => {
     state = createState();
   });
 
-  afterEach(() => {
-    jest.clearAllMocks();
-  });
-
   describe('fetchProjects', () => {
     beforeEach(() => {
       mockAxios = new MockAdapter(axios);
diff --git a/ee/spec/frontend/vue_shared/components/accordion/accordion_item_spec.js b/ee/spec/frontend/vue_shared/components/accordion/accordion_item_spec.js
index 30ec29a5c224684b100f8eba9fcb90a68d5e4830..6630d1459e549231a74bd33efbbd3b6375239a5f 100644
--- a/ee/spec/frontend/vue_shared/components/accordion/accordion_item_spec.js
+++ b/ee/spec/frontend/vue_shared/components/accordion/accordion_item_spec.js
@@ -54,8 +54,6 @@ describe('AccordionItem component', () => {
   afterEach(() => {
     wrapper.destroy();
     wrapper = null;
-
-    jest.clearAllMocks();
   });
 
   describe('rendering options', () => {
diff --git a/ee/spec/frontend/vue_shared/components/accordion/accordion_spec.js b/ee/spec/frontend/vue_shared/components/accordion/accordion_spec.js
index be6b892c6886022fa60d4579239324d56382f767..2f6655dae81a92e5db274d2ee56d31f63d49680e 100644
--- a/ee/spec/frontend/vue_shared/components/accordion/accordion_spec.js
+++ b/ee/spec/frontend/vue_shared/components/accordion/accordion_spec.js
@@ -22,8 +22,6 @@ describe('Accordion component', () => {
   afterEach(() => {
     wrapper.destroy();
     wrapper = null;
-
-    jest.clearAllMocks();
   });
 
   it('contains a default slot', () => {
diff --git a/ee/spec/frontend/vue_shared/security_reports/components/dismissal_comment_modal_footer_spec.js b/ee/spec/frontend/vue_shared/security_reports/components/dismissal_comment_modal_footer_spec.js
index 8ed5ec322d69c9da7c1e8a2deea66756eaef18b3..5bcd0a9e614f1ee662865f0523039050cfb44cf2 100644
--- a/ee/spec/frontend/vue_shared/security_reports/components/dismissal_comment_modal_footer_spec.js
+++ b/ee/spec/frontend/vue_shared/security_reports/components/dismissal_comment_modal_footer_spec.js
@@ -11,7 +11,6 @@ describe('DismissalCommentModalFooter', () => {
 
   afterEach(() => {
     document.body.dataset.page = origPage;
-    jest.clearAllMocks();
     wrapper.destroy();
   });
 
diff --git a/jest.config.js b/jest.config.js
index 79522552c6d99db0aa7733dee710adad5f5b5f0a..59e09c85b5ada4c2fd4e8effb1d7adb99e221850 100644
--- a/jest.config.js
+++ b/jest.config.js
@@ -55,6 +55,7 @@ if (IS_EE) {
 
 // eslint-disable-next-line import/no-commonjs
 module.exports = {
+  clearMocks: true,
   testMatch,
   moduleFileExtensions: ['js', 'json', 'vue'],
   moduleNameMapper,
diff --git a/spec/frontend/boards/boards_store_spec.js b/spec/frontend/boards/boards_store_spec.js
index 3588197ebdc921f21d7c9fd2b97e34ac4442b5ee..bf3d81d311780abff155a03ecff55d9d79bb0695 100644
--- a/spec/frontend/boards/boards_store_spec.js
+++ b/spec/frontend/boards/boards_store_spec.js
@@ -41,7 +41,6 @@ describe('boardsStore', () => {
 
   afterEach(() => {
     axiosMock.restore();
-    jest.clearAllMocks();
   });
 
   const setupDefaultResponses = () => {
diff --git a/spec/frontend/clusters/clusters_bundle_spec.js b/spec/frontend/clusters/clusters_bundle_spec.js
index 7b1d96c8da54145f401c48d62263afc486f7e39a..d7c648bcd208f75b2e3def894903b3e6570358e7 100644
--- a/spec/frontend/clusters/clusters_bundle_spec.js
+++ b/spec/frontend/clusters/clusters_bundle_spec.js
@@ -46,7 +46,6 @@ describe('Clusters', () => {
   afterEach(() => {
     cluster.destroy();
     mock.restore();
-    jest.clearAllMocks();
   });
 
   describe('class constructor', () => {
diff --git a/spec/frontend/commit/commit_pipeline_status_component_spec.js b/spec/frontend/commit/commit_pipeline_status_component_spec.js
index 36fc6ee52a8a16ab629b04f2fedce933f62f83ff..a2a6d405eab30410ea0ef555df7f95b36bece223 100644
--- a/spec/frontend/commit/commit_pipeline_status_component_spec.js
+++ b/spec/frontend/commit/commit_pipeline_status_component_spec.js
@@ -44,7 +44,6 @@ describe('Commit pipeline status component', () => {
   afterEach(() => {
     wrapper.destroy();
     wrapper = null;
-    jest.clearAllMocks();
   });
 
   describe('Visibility management', () => {
diff --git a/spec/frontend/create_cluster/eks_cluster/store/actions_spec.js b/spec/frontend/create_cluster/eks_cluster/store/actions_spec.js
index fda1f71b1f90550d4b832bc61f4e5de4bb74c97a..1139f0947058dd079185c7e229f3036d3ba72a5e 100644
--- a/spec/frontend/create_cluster/eks_cluster/store/actions_spec.js
+++ b/spec/frontend/create_cluster/eks_cluster/store/actions_spec.js
@@ -272,14 +272,11 @@ describe('EKS Cluster Store Actions', () => {
       payload = { name: ['Create cluster failed'] };
     });
 
-    it('commits createClusterError mutation', () => {
+    it('commits createClusterError mutation and displays flash message', () =>
       testAction(actions.createClusterError, payload, state, [
         { type: CREATE_CLUSTER_ERROR, payload },
-      ]);
-    });
-
-    it('creates a flash that displays the create cluster error', () => {
-      expect(createFlash).toHaveBeenCalledWith(payload.name[0]);
-    });
+      ]).then(() => {
+        expect(createFlash).toHaveBeenCalledWith(payload.name[0]);
+      }));
   });
 });
diff --git a/spec/frontend/ide/components/preview/clientside_spec.js b/spec/frontend/ide/components/preview/clientside_spec.js
index 6a33f4998c50ad3e5e3e376d3610d2c3ca098e20..5cb9e598fc42b5574b1d6777eae8bcd504e82667 100644
--- a/spec/frontend/ide/components/preview/clientside_spec.js
+++ b/spec/frontend/ide/components/preview/clientside_spec.js
@@ -68,10 +68,6 @@ describe('IDE clientside preview', () => {
     jest.useRealTimers();
   });
 
-  beforeEach(() => {
-    jest.clearAllMocks();
-  });
-
   afterEach(() => {
     wrapper.destroy();
   });
diff --git a/spec/frontend/ide/stores/modules/pipelines/actions_spec.js b/spec/frontend/ide/stores/modules/pipelines/actions_spec.js
index a58c7b8f81938a8d21494ece6bd5ade9f101a400..b08d1cd01da22ca0a866ce553bbad807ff32f6c9 100644
--- a/spec/frontend/ide/stores/modules/pipelines/actions_spec.js
+++ b/spec/frontend/ide/stores/modules/pipelines/actions_spec.js
@@ -111,8 +111,6 @@ describe('IDE pipelines actions', () => {
   });
 
   describe('fetchLatestPipeline', () => {
-    beforeEach(() => {});
-
     afterEach(() => {
       stopPipelinePolling();
       clearEtagPoll();
diff --git a/spec/frontend/issuables_list/components/issuables_list_app_spec.js b/spec/frontend/issuables_list/components/issuables_list_app_spec.js
index 666ccc074164389a48aac8722a42e176b454b6ab..621e8b8aa54416b9fb5b7ab52f2293d1f8f93159 100644
--- a/spec/frontend/issuables_list/components/issuables_list_app_spec.js
+++ b/spec/frontend/issuables_list/components/issuables_list_app_spec.js
@@ -72,7 +72,6 @@ describe('Issuables list component', () => {
   afterEach(() => {
     wrapper.destroy();
     mockAxios.restore();
-    jest.clearAllMocks();
     window.location = oldLocation;
   });
 
diff --git a/spec/frontend/jest_self_check/mocks_spec.js b/spec/frontend/jest_self_check/mocks_spec.js
new file mode 100644
index 0000000000000000000000000000000000000000..f1e9e12e6330b7ef92ee2dadf305547d5d77984c
--- /dev/null
+++ b/spec/frontend/jest_self_check/mocks_spec.js
@@ -0,0 +1,43 @@
+import * as textUtils from '~/lib/utils/text_utility';
+
+jest.mock('~/lib/utils/text_utility');
+
+describe('does restore mocks config work?', () => {
+  describe('shared spy', () => {
+    const spy = jest.fn();
+
+    beforeEach(() => {
+      spy();
+    });
+
+    it('is only called once', () => {
+      expect(spy).toHaveBeenCalledTimes(1);
+    });
+
+    it('is only called once B', () => {
+      expect(spy).toHaveBeenCalledTimes(1);
+    });
+
+    it('is only called once C', () => {
+      expect(spy).toHaveBeenCalledTimes(1);
+    });
+  });
+
+  describe('module mock', () => {
+    beforeEach(() => {
+      textUtils.humanize('');
+    });
+
+    it('is only called once', () => {
+      expect(textUtils.humanize).toHaveBeenCalledTimes(1);
+    });
+
+    it('is only called once B', () => {
+      expect(textUtils.humanize).toHaveBeenCalledTimes(1);
+    });
+
+    it('is only called once C', () => {
+      expect(textUtils.humanize).toHaveBeenCalledTimes(1);
+    });
+  });
+});
diff --git a/spec/frontend/notes/components/comment_form_spec.js b/spec/frontend/notes/components/comment_form_spec.js
index 10d92e9535c0bdd12206a43715850094c0b05285..7652f48474d58188da993f09688b35fe43b517fe 100644
--- a/spec/frontend/notes/components/comment_form_spec.js
+++ b/spec/frontend/notes/components/comment_form_spec.js
@@ -50,7 +50,6 @@ describe('issue_comment_form component', () => {
   afterEach(() => {
     axiosMock.restore();
     wrapper.destroy();
-    jest.clearAllMocks();
   });
 
   describe('user is logged in', () => {
diff --git a/spec/frontend/pages/admin/users/components/user_modal_manager_spec.js b/spec/frontend/pages/admin/users/components/user_modal_manager_spec.js
index 7653fffc5024299d886752bff08160476455adc7..c88a182660d784ce23ec39ac630bb1735587cee1 100644
--- a/spec/frontend/pages/admin/users/components/user_modal_manager_spec.js
+++ b/spec/frontend/pages/admin/users/components/user_modal_manager_spec.js
@@ -83,10 +83,6 @@ describe('Users admin page Modal Manager', () => {
       jest.spyOn(document, 'removeEventListener');
     });
 
-    afterEach(() => {
-      jest.clearAllMocks();
-    });
-
     afterAll(() => {
       jest.restoreAllMocks();
     });
diff --git a/spec/frontend/registry/list/components/app_spec.js b/spec/frontend/registry/list/components/app_spec.js
index f2733ac9fefb0d778732aa38eee8b055a6b7913a..5072a285f835de5dff29e077751a1538ec79fbb4 100644
--- a/spec/frontend/registry/list/components/app_spec.js
+++ b/spec/frontend/registry/list/components/app_spec.js
@@ -52,7 +52,6 @@ describe('Registry List', () => {
   });
 
   afterEach(() => {
-    jest.clearAllMocks();
     Vue.config.silent = false;
     wrapper.destroy();
   });
diff --git a/spec/frontend/repository/components/table/row_spec.js b/spec/frontend/repository/components/table/row_spec.js
index aa0b9385f1accd845a035add6cb9831715614a95..94fa8b1e36357ff079b838ddf6ff88f004fc2409 100644
--- a/spec/frontend/repository/components/table/row_spec.js
+++ b/spec/frontend/repository/components/table/row_spec.js
@@ -35,7 +35,6 @@ function factory(propsData = {}) {
 describe('Repository table row component', () => {
   afterEach(() => {
     vm.destroy();
-    jest.clearAllMocks();
   });
 
   it('renders table row', () => {
diff --git a/spec/frontend/sentry/sentry_config_spec.js b/spec/frontend/sentry/sentry_config_spec.js
index 62b8bbd50a2a732da376aba252f8cc3588ef0fe3..bcc7f29b98dd6947e61b468b2a1d45ee62871dae 100644
--- a/spec/frontend/sentry/sentry_config_spec.js
+++ b/spec/frontend/sentry/sentry_config_spec.js
@@ -54,8 +54,7 @@ describe('SentryConfig', () => {
     });
 
     it('should not call setUser if there is no current user ID', () => {
-      jest.clearAllMocks();
-
+      SentryConfig.setUser.mockClear();
       options.currentUserId = undefined;
 
       SentryConfig.init(options);
@@ -167,8 +166,6 @@ describe('SentryConfig', () => {
 
     describe('if no err is provided', () => {
       beforeEach(() => {
-        jest.clearAllMocks();
-
         SentryConfig.handleSentryErrors(event, req, config);
       });
 
@@ -191,8 +188,6 @@ describe('SentryConfig', () => {
       beforeEach(() => {
         req.responseText = undefined;
 
-        jest.clearAllMocks();
-
         SentryConfig.handleSentryErrors(event, req, config, err);
       });
 
diff --git a/spec/frontend/sidebar/confidential_issue_sidebar_spec.js b/spec/frontend/sidebar/confidential_issue_sidebar_spec.js
index 68dde14880ac157dba6f851cb7185708b09f9abc..432ec111e523b38e9c2ad70af6dd43132e204f9e 100644
--- a/spec/frontend/sidebar/confidential_issue_sidebar_spec.js
+++ b/spec/frontend/sidebar/confidential_issue_sidebar_spec.js
@@ -42,7 +42,6 @@ describe('Confidential Issue Sidebar Block', () => {
   };
 
   beforeEach(() => {
-    jest.clearAllMocks();
     jest.spyOn(window.location, 'reload').mockImplementation();
   });