diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index eced25ea08c81b69137bca135cda933f8083e9a5..3bc866081ceb78deb4e7c474fe5a8bee55d30972 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -10,7 +10,7 @@ default:
   - docker
 
 variables:
-  RUBY_VERSION: '2.7'
+  RUBY_VERSION: '3.0'
   REDIS_HOST: redis
 
 services:
@@ -63,7 +63,7 @@ spec:default:
         path: coverage/coverage.xml
   parallel:
     matrix:
-    - RUBY_VERSION: ['2.7', '3.0', '3.1']
+    - RUBY_VERSION: ['2.7', '3.0', '3.1', '3.2']
 
 spec:without_rails:
   stage: test
diff --git a/lib/gitlab/experiment/rspec.rb b/lib/gitlab/experiment/rspec.rb
index ef95b24506a00aa8e023b964889eaf30e50abc30..3b7882cd92f25a7d93c61f63b201e59d957e4209 100644
--- a/lib/gitlab/experiment/rspec.rb
+++ b/lib/gitlab/experiment/rspec.rb
@@ -28,6 +28,7 @@ module Gitlab
           RSpecMocks.track_gitlab_experiment_receiver(original_method, receiver)
           super
         end
+        ruby2_keywords :proxy_method_invoked if respond_to?(:ruby2_keywords, true)
       end
     end
 
@@ -69,8 +70,8 @@ module Gitlab
       def wrapped_experiment_chain_for(klass)
         @__wrapped_experiment_chains ||= {}
         @__wrapped_experiment_chains[klass.name || klass.object_id] ||= begin
-          allow(klass).to receive(:new).and_wrap_original do |method, *args, &original_block|
-            RSpecMocks.bind_gitlab_experiment_receiver(method).call(*args).tap do |instance|
+          allow(klass).to receive(:new).and_wrap_original do |method, *args, **kwargs, &original_block|
+            RSpecMocks.bind_gitlab_experiment_receiver(method).call(*args, **kwargs).tap do |instance|
               wrapped = @__wrapped_experiments[instance.instance_variable_get(:@_name)]
               wrapped&.blocks&.each { |b| b.call(instance, wrapped) }