diff --git a/modules/web/route.go b/modules/web/route.go
index d801f1025c..3a7e690659 100644
--- a/modules/web/route.go
+++ b/modules/web/route.go
@@ -14,6 +14,10 @@ import (
 	chi "github.com/go-chi/chi/v5"
 )
 
+type KeyTestMiddlewareHookType string
+
+var KeyTestMiddlewareHook = KeyTestMiddlewareHookType("testMiddlewareHook")
+
 // Bind binding an obj to a handler
 func Bind[T any](_ T) any {
 	return func(ctx *context.Context) {
diff --git a/routers/web/web.go b/routers/web/web.go
index 1b5bc2e342..c1b7649b4b 100644
--- a/routers/web/web.go
+++ b/routers/web/web.go
@@ -167,6 +167,10 @@ func Routes(ctx gocontext.Context) *web.Route {
 	mid = append(mid, user.GetNotificationCount)
 	mid = append(mid, repo.GetActiveStopwatch)
 	mid = append(mid, goGet)
+	middlewareHook := ctx.Value(web.KeyTestMiddlewareHook)
+	if middlewareHook != nil {
+		mid = append(mid, middlewareHook)
+	}
 
 	others := web.NewRoute()
 	others.Use(mid...)
diff --git a/tests/integration/api_activitypub_person_test.go b/tests/integration/api_activitypub_person_test.go
index 301cfba172..140cf0f034 100644
--- a/tests/integration/api_activitypub_person_test.go
+++ b/tests/integration/api_activitypub_person_test.go
@@ -14,7 +14,6 @@ import (
 	user_model "code.gitea.io/gitea/models/user"
 	"code.gitea.io/gitea/modules/activitypub"
 	"code.gitea.io/gitea/modules/setting"
-	"code.gitea.io/gitea/routers"
 
 	ap "github.com/go-ap/activitypub"
 	"github.com/stretchr/testify/assert"
@@ -22,10 +21,10 @@ import (
 
 func TestActivityPubPerson(t *testing.T) {
 	setting.Federation.Enabled = true
-	c = routers.NormalRoutes(context.TODO())
+	setNormalRoutes()
 	defer func() {
 		setting.Federation.Enabled = false
-		c = routers.NormalRoutes(context.TODO())
+		setNormalRoutes()
 	}()
 
 	onGiteaRun(t, func(*testing.T, *url.URL) {
@@ -60,10 +59,10 @@ func TestActivityPubPerson(t *testing.T) {
 
 func TestActivityPubMissingPerson(t *testing.T) {
 	setting.Federation.Enabled = true
-	c = routers.NormalRoutes(context.TODO())
+	setNormalRoutes()
 	defer func() {
 		setting.Federation.Enabled = false
-		c = routers.NormalRoutes(context.TODO())
+		setNormalRoutes()
 	}()
 
 	onGiteaRun(t, func(*testing.T, *url.URL) {
@@ -75,10 +74,10 @@ func TestActivityPubMissingPerson(t *testing.T) {
 
 func TestActivityPubPersonInbox(t *testing.T) {
 	setting.Federation.Enabled = true
-	c = routers.NormalRoutes(context.TODO())
+	setNormalRoutes()
 	defer func() {
 		setting.Federation.Enabled = false
-		c = routers.NormalRoutes(context.TODO())
+		setNormalRoutes()
 	}()
 
 	srv := httptest.NewServer(c)
diff --git a/tests/integration/api_nodeinfo_test.go b/tests/integration/api_nodeinfo_test.go
index bc2f11a7f2..3052d95be0 100644
--- a/tests/integration/api_nodeinfo_test.go
+++ b/tests/integration/api_nodeinfo_test.go
@@ -4,24 +4,22 @@
 package integration
 
 import (
-	"context"
 	"net/http"
 	"net/url"
 	"testing"
 
 	"code.gitea.io/gitea/modules/setting"
 	api "code.gitea.io/gitea/modules/structs"
-	"code.gitea.io/gitea/routers"
 
 	"github.com/stretchr/testify/assert"
 )
 
 func TestNodeinfo(t *testing.T) {
 	setting.Federation.Enabled = true
-	c = routers.NormalRoutes(context.TODO())
+	setNormalRoutes()
 	defer func() {
 		setting.Federation.Enabled = false
-		c = routers.NormalRoutes(context.TODO())
+		setNormalRoutes()
 	}()
 
 	onGiteaRun(t, func(*testing.T, *url.URL) {
diff --git a/tests/integration/create_no_session_test.go b/tests/integration/create_no_session_test.go
index 9a96ed61fa..81e02e3c2c 100644
--- a/tests/integration/create_no_session_test.go
+++ b/tests/integration/create_no_session_test.go
@@ -4,7 +4,6 @@
 package integration
 
 import (
-	"context"
 	"net/http"
 	"net/http/httptest"
 	"os"
@@ -13,7 +12,6 @@ import (
 
 	"code.gitea.io/gitea/modules/json"
 	"code.gitea.io/gitea/modules/setting"
-	"code.gitea.io/gitea/routers"
 	"code.gitea.io/gitea/tests"
 
 	"gitea.com/go-chi/session"
@@ -57,7 +55,7 @@ func TestSessionFileCreation(t *testing.T) {
 	oldSessionConfig := setting.SessionConfig.ProviderConfig
 	defer func() {
 		setting.SessionConfig.ProviderConfig = oldSessionConfig
-		c = routers.NormalRoutes(context.TODO())
+		setNormalRoutes()
 	}()
 
 	var config session.Options
@@ -76,7 +74,7 @@ func TestSessionFileCreation(t *testing.T) {
 
 	setting.SessionConfig.ProviderConfig = string(newConfigBytes)
 
-	c = routers.NormalRoutes(context.TODO())
+	setNormalRoutes()
 
 	t.Run("NoSessionOnViewIssue", func(t *testing.T) {
 		defer tests.PrintCurrentTest(t)()
diff --git a/tests/integration/integration_test.go b/tests/integration/integration_test.go
index 27918a9ccc..4d9ecf3faf 100644
--- a/tests/integration/integration_test.go
+++ b/tests/integration/integration_test.go
@@ -40,7 +40,19 @@ import (
 	"github.com/xeipuuv/gojsonschema"
 )
 
-var c *web.Route
+var (
+	c                  *web.Route
+	testMiddlewareHook func(*gitea_context.Context)
+)
+
+func setNormalRoutes() {
+	middlewareHook := func(ctx *gitea_context.Context) {
+		if testMiddlewareHook != nil {
+			testMiddlewareHook(ctx)
+		}
+	}
+	c = routers.NormalRoutes(context.WithValue(context.Background(), web.KeyTestMiddlewareHook, middlewareHook))
+}
 
 type NilResponseRecorder struct {
 	httptest.ResponseRecorder
@@ -87,8 +99,7 @@ func TestMain(m *testing.M) {
 	defer cancel()
 
 	tests.InitTest(true)
-	c = routers.NormalRoutes(context.TODO())
-
+	setNormalRoutes()
 	// integration test settings...
 	if setting.CfgProvider != nil {
 		testingCfg := setting.CfgProvider.Section("integration-tests")