diff --git a/prdoc/pr_5713.prdoc b/prdoc/pr_5713.prdoc
new file mode 100644
index 0000000000000000000000000000000000000000..54d3619cdcaff17dbd8795ad9ab05491ce72c99f
--- /dev/null
+++ b/prdoc/pr_5713.prdoc
@@ -0,0 +1,10 @@
+title: "pallet-treasury: Improve `remove_approval` benchmark"
+
+doc:
+  - audience: Runtime Dev
+    description: |
+      Fix the `remove_approval` benchmark when `SpendOrigin` doesn't return any `succesful_origin`.
+
+crates:
+  - name: pallet-treasury
+    bump: patch
diff --git a/substrate/frame/treasury/src/benchmarking.rs b/substrate/frame/treasury/src/benchmarking.rs
index 63978c94e682f8cca84146e69c4b2e17d06ae637..95bf63299049afa62e332227bee8bf65fafc7ec8 100644
--- a/substrate/frame/treasury/src/benchmarking.rs
+++ b/substrate/frame/treasury/src/benchmarking.rs
@@ -26,7 +26,7 @@ use frame_benchmarking::{
 	v2::*,
 };
 use frame_support::{
-	ensure,
+	assert_err, assert_ok, ensure,
 	traits::{
 		tokens::{ConversionFromAssetBalance, PaymentStatus},
 		EnsureOrigin, OnInitialize,
@@ -126,16 +126,31 @@ mod benchmarks {
 
 	#[benchmark]
 	fn remove_approval() -> Result<(), BenchmarkError> {
-		let origin =
-			T::SpendOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?;
-		let (_, value, beneficiary_lookup) = setup_proposal::<T, _>(SEED);
-		Treasury::<T, _>::spend_local(origin, value, beneficiary_lookup)?;
-		let proposal_id = Treasury::<T, _>::proposal_count() - 1;
+		let (spend_exists, proposal_id) =
+			if let Ok(origin) = T::SpendOrigin::try_successful_origin() {
+				let (_, value, beneficiary_lookup) = setup_proposal::<T, _>(SEED);
+				Treasury::<T, _>::spend_local(origin, value, beneficiary_lookup)?;
+				let proposal_id = Treasury::<T, _>::proposal_count() - 1;
+
+				(true, proposal_id)
+			} else {
+				(false, 0)
+			};
+
 		let reject_origin =
 			T::RejectOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?;
 
-		#[extrinsic_call]
-		_(reject_origin as T::RuntimeOrigin, proposal_id);
+		#[block]
+		{
+			let res =
+				Treasury::<T, _>::remove_approval(reject_origin as T::RuntimeOrigin, proposal_id);
+
+			if spend_exists {
+				assert_ok!(res);
+			} else {
+				assert_err!(res, Error::<T, _>::ProposalNotApproved);
+			}
+		}
 
 		Ok(())
 	}