Repository: open-feature/go-sdk
Pull request #341 (2025-05-07 19:54:56)

feat: Make Mocks Exportable
<!-- Please use this template for your pull request. -->
<!-- Please use the sections that you need and delete other sections -->

## This PR
<!-- add the description of the PR here -->

- Updated the abandoned version of gomock & mockgen for the UberMock version.
- Makes generated mocks exportable to be usable by other packages or external users
- Sets a new build tag `testtools` on the generated mock files & updates the Makefile to use this build tag when running tests or linting
- Updated documentation related to using these mocks
- Added `codecov.yml` file to prevent mocks from being included in coverage reports

### Notes

I started working on migrating my multiprovider work from `go-sdk-contrib` to the main SDK here. The multiprovider makes sense to be in it's own package within the SDK considering it's part of the appendix spec similar to the `InMemoryProvider`. To fully unit test this component I would need to leverage the already generated mocks so making them exportable and usable outside the `openfeature` package. This also exposes them outside of the library so I've added the build tags and documentation about their usage. This PR is essentially a prereq task to making sure the `MultiProvider` has regression & unit tests.


codecov[bot]: ## [Codecov](https://app.codecov.io/gh/open-feature/go-sdk/pull/341?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=open-feature) Report
Attention: Patch coverage is `14.42308%` with `89 lines` in your changes missing coverage. Please review.
> Project coverage is 62.38%. Comparing base [(`640448d`)](https://app.codecov.io/gh/open-feature/go-sdk/commit/640448d9e1e1c76bc9e7fe7c7b7dbce2298493cb?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=open-feature) to head [(`8904308`)](https://app.codecov.io/gh/open-feature/go-sdk/commit/890430813290aae1c2e510feecf14edf38adf9cc?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=open-feature).

| [Files with missing lines](https://app.codecov.io/gh/open-feature/go-sdk/pull/341?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=open-feature) | Patch % | Lines |
|---|---|---|
| [openfeature/interfaces\_mock.go](https://app.codecov.io/gh/open-feature/go-sdk/pull/341?src=pr&el=tree&filepath=openfeature%2Finterfaces_mock.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=open-feature#diff-b3BlbmZlYXR1cmUvaW50ZXJmYWNlc19tb2NrLmdv) | 2.22% | [88 Missing :warning: ](https://app.codecov.io/gh/open-feature/go-sdk/pull/341?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=open-feature) |
| [openfeature/provider\_mock.go](https://app.codecov.io/gh/open-feature/go-sdk/pull/341?src=pr&el=tree&filepath=openfeature%2Fprovider_mock.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=open-feature#diff-b3BlbmZlYXR1cmUvcHJvdmlkZXJfbW9jay5nbw==) | 87.50% | [1 Missing :warning: ](https://app.codecov.io/gh/open-feature/go-sdk/pull/341?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=open-feature) |

<details><summary>Additional details and impacted files</summary>


```diff
@@             Coverage Diff             @@
##             main     #341       +/-   ##
===========================================
- Coverage   88.13%   62.38%   -25.76%     
===========================================
  Files          14       23        +9     
  Lines        1408     2212      +804     
===========================================
+ Hits         1241     1380      +139     
- Misses        143      808      +665     
  Partials       24       24               
```

| [Flag](https://app.codecov.io/gh/open-feature/go-sdk/pull/341/flags?src=pr&el=flags&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=open-feature) | Coverage Δ | |
|---|---|---|
| [e2e](https://app.codecov.io/gh/open-feature/go-sdk/pull/341/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=open-feature) | `62.38% <14.42%> (-25.76%)` | :arrow_down: |
| [unit](https://app.codecov.io/gh/open-feature/go-sdk/pull/341/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=open-feature) | `62.38% <14.42%> (-25.76%)` | :arrow_down: |

Flags with carried forward coverage won't be shown. [Click here](https://docs.codecov.io/docs/carryforward-flags?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=open-feature#carryforward-flags-in-the-pull-request-comment) to find out more.

</details>

[:umbrella: View full report in Codecov by Sentry](https://app.codecov.io/gh/open-feature/go-sdk/pull/341?dropdown=coverage&src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=open-feature).   
:loudspeaker: Have feedback on the report? [Share it here](https://about.codecov.io/codecov-pr-comment-feedback/?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=open-feature).

<details><summary> :rocket: New features to boost your workflow: </summary>

- :snowflake: [Test Analytics](https://docs.codecov.com/docs/test-analytics): Detect flaky tests, report on failures, and find test suite problems.
</details>
jblacker: I wanted to put the mocks into their own package, but unfortunately I was not able to resolve the import cycles without breaking changes.
thomaspoignant: @jblacker why do you need to add a tag for the build? I am not sure to understand the benefits of having it?
Would it be better to add the mock in a separated project that we can import in the go.mod?
jblacker: @thomaspoignant It's not _needed_, but imho it's a nice to have as it prevents the mocks from being compiled by default when building the application since they are no longer "test files".

Personally, I'm not a fan of putting mocks into a separate project; especially for a library like this.
thomaspoignant: Ok I get it, sounds good to me.

Patch:
diff --git a/.github/workflows/pr-checks.yml b/.github/workflows/pr-checks.yml
index 5b9faef..8c6b94f 100644
--- a/.github/workflows/pr-checks.yml
+++ b/.github/workflows/pr-checks.yml
@@ -54,9 +54,9 @@ jobs:
           path: ~/go/pkg/mod
           key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('**/go.sum') }}
       - name: Run unit tests
-        run: go test -race -short -coverpkg=./... -coverprofile=coverage-unit.out -covermode=atomic ./...
+        run: go test -tags testtools -race -short -coverpkg=./... -coverprofile=coverage-unit.out -covermode=atomic ./...
       - name: Run e2e tests
-        run: go test -race -coverpkg=./... -coverprofile=coverage-e2e.out -covermode=atomic ./e2e/...
+        run: go test -tags testtools -race -coverpkg=./... -coverprofile=coverage-e2e.out -covermode=atomic ./e2e/...
       - name: Upload coverage to Codecov (unit)
         uses: codecov/codecov-action@ad3126e916f78f00edff4ed0317cf185271ccc2d # v5.4.2
         with:
diff --git a/Makefile b/Makefile
index 99b3164..c1d63cc 100644
--- a/Makefile
+++ b/Makefile
@@ -1,12 +1,16 @@
 .PHONY: mockgen test lint e2e-test
 mockgen:
-	mockgen -source=openfeature/provider.go -destination=openfeature/provider_mock_test.go -package=openfeature
-	mockgen -source=openfeature/hooks.go -destination=openfeature/hooks_mock_test.go -package=openfeature
-	mockgen -source=openfeature/interfaces.go -destination=openfeature/interfaces_mock_test.go -package=openfeature
+	go install go.uber.org/mock/mockgen@latest
+	mockgen -source=openfeature/provider.go -destination=openfeature/provider_mock.go -package=openfeature
+	mockgen -source=openfeature/hooks.go -destination=openfeature/hooks_mock.go -package=openfeature
+	mockgen -source=openfeature/interfaces.go -destination=openfeature/interfaces_mock.go -package=openfeature
+	sed -i.old $$'1s;^;//go:build testtools\\n\\n;' openfeature/*_mock.go
+	rm -f openfeature/*_mock.go.old
+
 test:
-	go test --short -cover ./...
+	go test --short -tags testtools -cover ./...
 e2e-test:
-	 git submodule update --init --recursive && go test -race -cover ./e2e/...
+	 git submodule update --init --recursive && go test -tags testtools -race -cover ./e2e/...
 lint:
 	go install -v github.com/golangci/golangci-lint/cmd/golangci-lint@v1.54.1
-	${GOPATH}/bin/golangci-lint run --deadline=3m --timeout=3m ./... # Run linters
+	${GOPATH}/bin/golangci-lint run --build-tags testtools --deadline=3m --timeout=3m ./... # Run linters
diff --git a/README.md b/README.md
index b95f3a2..acd91d8 100644
--- a/README.md
+++ b/README.md
@@ -500,6 +500,13 @@ for name, tt := range tests {
 }
 ```
 
+### Mocks
+
+Mocks are also available for testing purposes for all interfaces within the OpenFeature SDK. These are primarily
+intended for internal use for testing the SDK, but have been exported to ease the testing burden for any extensions
+or custom components (e.g. hooks & providers). These mocks are not include in builds by default. The build tag 
+`testtools` must be used to have the mocks included in builds.
+
 <!-- x-hide-in-docs-start -->
 ## ⭐️ Support the project
 
diff --git a/codecov.yml b/codecov.yml
new file mode 100644
index 0000000..384a88c
--- /dev/null
+++ b/codecov.yml
@@ -0,0 +1,2 @@
+ignore:
+  - "openfeature/*_mock.go"
\ No newline at end of file
diff --git a/go.mod b/go.mod
index 9c0695e..127ce95 100644
--- a/go.mod
+++ b/go.mod
@@ -5,7 +5,7 @@ go 1.21
 require (
 	github.com/cucumber/godog v0.15.0
 	github.com/go-logr/logr v1.4.2
-	github.com/golang/mock v1.6.0
+	go.uber.org/mock v0.4.0
 	golang.org/x/text v0.22.0
 )
 
@@ -17,5 +17,4 @@ require (
 	github.com/hashicorp/go-memdb v1.3.4 // indirect
 	github.com/hashicorp/golang-lru v1.0.2 // indirect
 	github.com/spf13/pflag v1.0.5 // indirect
-	github.com/stretchr/testify v1.8.4 // indirect
 )
diff --git a/go.sum b/go.sum
index 5b18458..4f06793 100644
--- a/go.sum
+++ b/go.sum
@@ -15,8 +15,6 @@ github.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRx
 github.com/gofrs/uuid v4.3.1+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
 github.com/gofrs/uuid v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA=
 github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
-github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=
-github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
 github.com/hashicorp/go-immutable-radix v1.3.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
 github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=
 github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
@@ -45,34 +43,12 @@ github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpE
 github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
 github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
+github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8=
 github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
-github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
-github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
-github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
-golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
-golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
-golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
-golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
-golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
-golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU=
+go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc=
 golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM=
 golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY=
-golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
-golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=


Test patch:
diff --git a/openfeature/client_test.go b/openfeature/client_test.go
index e54809c..15e8080 100644
--- a/openfeature/client_test.go
+++ b/openfeature/client_test.go
@@ -3,12 +3,11 @@ package openfeature
 import (
 	"context"
 	"errors"
+	"go.uber.org/mock/gomock"
 	"math"
 	"reflect"
 	"testing"
 	"time"
-
-	"github.com/golang/mock/gomock"
 )
 
 type clientMocks struct {
diff --git a/openfeature/evaluation_context_test.go b/openfeature/evaluation_context_test.go
index d7ada99..1edbfe3 100644
--- a/openfeature/evaluation_context_test.go
+++ b/openfeature/evaluation_context_test.go
@@ -5,8 +5,8 @@ import (
 	"reflect"
 	"testing"
 
-	"github.com/golang/mock/gomock"
 	"github.com/open-feature/go-sdk/openfeature/internal"
+	"go.uber.org/mock/gomock"
 )
 
 // The `evaluation context` structure MUST define an optional `targeting key` field of type string,
diff --git a/openfeature/hooks_mock_test.go b/openfeature/hooks_mock.go
similarity index 84%
rename from openfeature/hooks_mock_test.go
rename to openfeature/hooks_mock.go
index 197d799..676f110 100644
--- a/openfeature/hooks_mock_test.go
+++ b/openfeature/hooks_mock.go
@@ -1,5 +1,12 @@
+//go:build testtools
+
 // Code generated by MockGen. DO NOT EDIT.
 // Source: openfeature/hooks.go
+//
+// Generated by this command:
+//
+//	mockgen -source=openfeature/hooks.go -destination=openfeature/hooks_mock.go -package=openfeature
+//
 
 // Package openfeature is a generated GoMock package.
 package openfeature
@@ -8,13 +15,14 @@ import (
 	context "context"
 	reflect "reflect"
 
-	gomock "github.com/golang/mock/gomock"
+	gomock "go.uber.org/mock/gomock"
 )
 
 // MockHook is a mock of Hook interface.
 type MockHook struct {
 	ctrl     *gomock.Controller
 	recorder *MockHookMockRecorder
+	isgomock struct{}
 }
 
 // MockHookMockRecorder is the mock recorder for MockHook.
@@ -43,7 +51,7 @@ func (m *MockHook) After(ctx context.Context, hookContext HookContext, flagEvalu
 }
 
 // After indicates an expected call of After.
-func (mr *MockHookMockRecorder) After(ctx, hookContext, flagEvaluationDetails, hookHints interface{}) *gomock.Call {
+func (mr *MockHookMockRecorder) After(ctx, hookContext, flagEvaluationDetails, hookHints any) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "After", reflect.TypeOf((*MockHook)(nil).After), ctx, hookContext, flagEvaluationDetails, hookHints)
 }
@@ -58,7 +66,7 @@ func (m *MockHook) Before(ctx context.Context, hookContext HookContext, hookHint
 }
 
 // Before indicates an expected call of Before.
-func (mr *MockHookMockRecorder) Before(ctx, hookContext, hookHints interface{}) *gomock.Call {
+func (mr *MockHookMockRecorder) Before(ctx, hookContext, hookHints any) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Before", reflect.TypeOf((*MockHook)(nil).Before), ctx, hookContext, hookHints)
 }
@@ -70,7 +78,7 @@ func (m *MockHook) Error(ctx context.Context, hookContext HookContext, err error
 }
 
 // Error indicates an expected call of Error.
-func (mr *MockHookMockRecorder) Error(ctx, hookContext, err, hookHints interface{}) *gomock.Call {
+func (mr *MockHookMockRecorder) Error(ctx, hookContext, err, hookHints any) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Error", reflect.TypeOf((*MockHook)(nil).Error), ctx, hookContext, err, hookHints)
 }
@@ -78,11 +86,11 @@ func (mr *MockHookMockRecorder) Error(ctx, hookContext, err, hookHints interface
 // Finally mocks base method.
 func (m *MockHook) Finally(ctx context.Context, hookContext HookContext, flagEvaluationDetails InterfaceEvaluationDetails, hookHints HookHints) {
 	m.ctrl.T.Helper()
-	m.ctrl.Call(m, "Finally", ctx, hookContext, hookHints)
+	m.ctrl.Call(m, "Finally", ctx, hookContext, flagEvaluationDetails, hookHints)
 }
 
 // Finally indicates an expected call of Finally.
-func (mr *MockHookMockRecorder) Finally(ctx, hookContext, flagEvaluationDetails, hookHints interface{}) *gomock.Call {
+func (mr *MockHookMockRecorder) Finally(ctx, hookContext, flagEvaluationDetails, hookHints any) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Finally", reflect.TypeOf((*MockHook)(nil).Finally), ctx, hookContext, hookHints)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Finally", reflect.TypeOf((*MockHook)(nil).Finally), ctx, hookContext, flagEvaluationDetails, hookHints)
 }
diff --git a/openfeature/hooks_test.go b/openfeature/hooks_test.go
index 21bc81c..3f318c2 100644
--- a/openfeature/hooks_test.go
+++ b/openfeature/hooks_test.go
@@ -3,12 +3,11 @@ package openfeature
 import (
 	"context"
 	"errors"
+	"go.uber.org/mock/gomock"
 	"reflect"
 	"testing"
 	"time"
 
-	"github.com/golang/mock/gomock"
-
 	"golang.org/x/text/cases"
 	"golang.org/x/text/language"
 )
diff --git a/openfeature/interfaces_mock_test.go b/openfeature/interfaces_mock.go
similarity index 88%
rename from openfeature/interfaces_mock_test.go
rename to openfeature/interfaces_mock.go
index 02f6431..3948f47 100644
--- a/openfeature/interfaces_mock_test.go
+++ b/openfeature/interfaces_mock.go
@@ -1,5 +1,12 @@
+//go:build testtools
+
 // Code generated by MockGen. DO NOT EDIT.
 // Source: openfeature/interfaces.go
+//
+// Generated by this command:
+//
+//	mockgen -source=openfeature/interfaces.go -destination=openfeature/interfaces_mock.go -package=openfeature
+//
 
 // Package openfeature is a generated GoMock package.
 package openfeature
@@ -9,13 +16,14 @@ import (
 	reflect "reflect"
 
 	logr "github.com/go-logr/logr"
-	gomock "github.com/golang/mock/gomock"
+	gomock "go.uber.org/mock/gomock"
 )
 
 // MockIEvaluation is a mock of IEvaluation interface.
 type MockIEvaluation struct {
 	ctrl     *gomock.Controller
 	recorder *MockIEvaluationMockRecorder
+	isgomock struct{}
 }
 
 // MockIEvaluationMockRecorder is the mock recorder for MockIEvaluation.
@@ -42,7 +50,7 @@ func (m *MockIEvaluation) AddHandler(eventType EventType, callback EventCallback
 }
 
 // AddHandler indicates an expected call of AddHandler.
-func (mr *MockIEvaluationMockRecorder) AddHandler(eventType, callback interface{}) *gomock.Call {
+func (mr *MockIEvaluationMockRecorder) AddHandler(eventType, callback any) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddHandler", reflect.TypeOf((*MockIEvaluation)(nil).AddHandler), eventType, callback)
 }
@@ -50,7 +58,7 @@ func (mr *MockIEvaluationMockRecorder) AddHandler(eventType, callback interface{
 // AddHooks mocks base method.
 func (m *MockIEvaluation) AddHooks(hooks ...Hook) {
 	m.ctrl.T.Helper()
-	varargs := []interface{}{}
+	varargs := []any{}
 	for _, a := range hooks {
 		varargs = append(varargs, a)
 	}
@@ -58,7 +66,7 @@ func (m *MockIEvaluation) AddHooks(hooks ...Hook) {
 }
 
 // AddHooks indicates an expected call of AddHooks.
-func (mr *MockIEvaluationMockRecorder) AddHooks(hooks ...interface{}) *gomock.Call {
+func (mr *MockIEvaluationMockRecorder) AddHooks(hooks ...any) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddHooks", reflect.TypeOf((*MockIEvaluation)(nil).AddHooks), hooks...)
 }
@@ -86,7 +94,7 @@ func (m *MockIEvaluation) GetNamedClient(clientName string) IClient {
 }
 
 // GetNamedClient indicates an expected call of GetNamedClient.
-func (mr *MockIEvaluationMockRecorder) GetNamedClient(clientName interface{}) *gomock.Call {
+func (mr *MockIEvaluationMockRecorder) GetNamedClient(clientName any) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetNamedClient", reflect.TypeOf((*MockIEvaluation)(nil).GetNamedClient), clientName)
 }
@@ -100,7 +108,7 @@ func (m *MockIEvaluation) GetNamedProviderMetadata(name string) Metadata {
 }
 
 // GetNamedProviderMetadata indicates an expected call of GetNamedProviderMetadata.
-func (mr *MockIEvaluationMockRecorder) GetNamedProviderMetadata(name interface{}) *gomock.Call {
+func (mr *MockIEvaluationMockRecorder) GetNamedProviderMetadata(name any) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetNamedProviderMetadata", reflect.TypeOf((*MockIEvaluation)(nil).GetNamedProviderMetadata), name)
 }
@@ -126,7 +134,7 @@ func (m *MockIEvaluation) RemoveHandler(eventType EventType, callback EventCallb
 }
 
 // RemoveHandler indicates an expected call of RemoveHandler.
-func (mr *MockIEvaluationMockRecorder) RemoveHandler(eventType, callback interface{}) *gomock.Call {
+func (mr *MockIEvaluationMockRecorder) RemoveHandler(eventType, callback any) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RemoveHandler", reflect.TypeOf((*MockIEvaluation)(nil).RemoveHandler), eventType, callback)
 }
@@ -138,7 +146,7 @@ func (m *MockIEvaluation) SetEvaluationContext(apiCtx EvaluationContext) {
 }
 
 // SetEvaluationContext indicates an expected call of SetEvaluationContext.
-func (mr *MockIEvaluationMockRecorder) SetEvaluationContext(apiCtx interface{}) *gomock.Call {
+func (mr *MockIEvaluationMockRecorder) SetEvaluationContext(apiCtx any) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetEvaluationContext", reflect.TypeOf((*MockIEvaluation)(nil).SetEvaluationContext), apiCtx)
 }
@@ -152,7 +160,7 @@ func (m *MockIEvaluation) SetNamedProvider(clientName string, provider FeaturePr
 }
 
 // SetNamedProvider indicates an expected call of SetNamedProvider.
-func (mr *MockIEvaluationMockRecorder) SetNamedProvider(clientName, provider, async interface{}) *gomock.Call {
+func (mr *MockIEvaluationMockRecorder) SetNamedProvider(clientName, provider, async any) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetNamedProvider", reflect.TypeOf((*MockIEvaluation)(nil).SetNamedProvider), clientName, provider, async)
 }
@@ -166,7 +174,7 @@ func (m *MockIEvaluation) SetProvider(provider FeatureProvider) error {
 }
 
 // SetProvider indicates an expected call of SetProvider.
-func (mr *MockIEvaluationMockRecorder) SetProvider(provider interface{}) *gomock.Call {
+func (mr *MockIEvaluationMockRecorder) SetProvider(provider any) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetProvider", reflect.TypeOf((*MockIEvaluation)(nil).SetProvider), provider)
 }
@@ -180,7 +188,7 @@ func (m *MockIEvaluation) SetProviderAndWait(provider FeatureProvider) error {
 }
 
 // SetProviderAndWait indicates an expected call of SetProviderAndWait.
-func (mr *MockIEvaluationMockRecorder) SetProviderAndWait(provider interface{}) *gomock.Call {
+func (mr *MockIEvaluationMockRecorder) SetProviderAndWait(provider any) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetProviderAndWait", reflect.TypeOf((*MockIEvaluation)(nil).SetProviderAndWait), provider)
 }
@@ -201,6 +209,7 @@ func (mr *MockIEvaluationMockRecorder) Shutdown() *gomock.Call {
 type MockIClient struct {
 	ctrl     *gomock.Controller
 	recorder *MockIClientMockRecorder
+	isgomock struct{}
 }
 
 // MockIClientMockRecorder is the mock recorder for MockIClient.
@@ -227,7 +236,7 @@ func (m *MockIClient) AddHandler(eventType EventType, callback EventCallback) {
 }
 
 // AddHandler indicates an expected call of AddHandler.
-func (mr *MockIClientMockRecorder) AddHandler(eventType, callback interface{}) *gomock.Call {
+func (mr *MockIClientMockRecorder) AddHandler(eventType, callback any) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddHandler", reflect.TypeOf((*MockIClient)(nil).AddHandler), eventType, callback)
 }
@@ -235,7 +244,7 @@ func (mr *MockIClientMockRecorder) AddHandler(eventType, callback interface{}) *
 // AddHooks mocks base method.
 func (m *MockIClient) AddHooks(hooks ...Hook) {
 	m.ctrl.T.Helper()
-	varargs := []interface{}{}
+	varargs := []any{}
 	for _, a := range hooks {
 		varargs = append(varargs, a)
 	}
@@ -243,7 +252,7 @@ func (m *MockIClient) AddHooks(hooks ...Hook) {
 }
 
 // AddHooks indicates an expected call of AddHooks.
-func (mr *MockIClientMockRecorder) AddHooks(hooks ...interface{}) *gomock.Call {
+func (mr *MockIClientMockRecorder) AddHooks(hooks ...any) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddHooks", reflect.TypeOf((*MockIClient)(nil).AddHooks), hooks...)
 }
@@ -251,7 +260,7 @@ func (mr *MockIClientMockRecorder) AddHooks(hooks ...interface{}) *gomock.Call {
 // Boolean mocks base method.
 func (m *MockIClient) Boolean(ctx context.Context, flag string, defaultValue bool, evalCtx EvaluationContext, options ...Option) bool {
 	m.ctrl.T.Helper()
-	varargs := []interface{}{ctx, flag, defaultValue, evalCtx}
+	varargs := []any{ctx, flag, defaultValue, evalCtx}
 	for _, a := range options {
 		varargs = append(varargs, a)
 	}
@@ -261,16 +270,16 @@ func (m *MockIClient) Boolean(ctx context.Context, flag string, defaultValue boo
 }
 
 // Boolean indicates an expected call of Boolean.
-func (mr *MockIClientMockRecorder) Boolean(ctx, flag, defaultValue, evalCtx interface{}, options ...interface{}) *gomock.Call {
+func (mr *MockIClientMockRecorder) Boolean(ctx, flag, defaultValue, evalCtx any, options ...any) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
-	varargs := append([]interface{}{ctx, flag, defaultValue, evalCtx}, options...)
+	varargs := append([]any{ctx, flag, defaultValue, evalCtx}, options...)
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Boolean", reflect.TypeOf((*MockIClient)(nil).Boolean), varargs...)
 }
 
 // BooleanValue mocks base method.
 func (m *MockIClient) BooleanValue(ctx context.Context, flag string, defaultValue bool, evalCtx EvaluationContext, options ...Option) (bool, error) {
 	m.ctrl.T.Helper()
-	varargs := []interface{}{ctx, flag, defaultValue, evalCtx}
+	varargs := []any{ctx, flag, defaultValue, evalCtx}
 	for _, a := range options {
 		varargs = append(varargs, a)
 	}
@@ -281,16 +290,16 @@ func (m *MockIClient) BooleanValue(ctx context.Context, flag string, defaultValu
 }
 
 // BooleanValue indicates an expected call of BooleanValue.
-func (mr *MockIClientMockRecorder) BooleanValue(ctx, flag, defaultValue, evalCtx interface{}, options ...interface{}) *gomock.Call {
+func (mr *MockIClientMockRecorder) BooleanValue(ctx, flag, defaultValue, evalCtx any, options ...any) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
-	varargs := append([]interface{}{ctx, flag, defaultValue, evalCtx}, options...)
+	varargs := append([]any{ctx, flag, defaultValue, evalCtx}, options...)
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BooleanValue", reflect.TypeOf((*MockIClient)(nil).BooleanValue), varargs...)
 }
 
 // BooleanValueDetails mocks base method.
 func (m *MockIClient) BooleanValueDetails(ctx context.Context, flag string, defaultValue bool, evalCtx EvaluationContext, options ...Option) (BooleanEvaluationDetails, error) {
 	m.ctrl.T.Helper()
-	varargs := []interface{}{ctx, flag, defaultValue, evalCtx}
+	varargs := []any{ctx, flag, defaultValue, evalCtx}
 	for _, a := range options {
 		varargs = append(varargs, a)
 	}
@@ -301,9 +310,9 @@ func (m *MockIClient) BooleanValueDetails(ctx context.Context, flag string, defa
 }
 
 // BooleanValueDetails indicates an expected call of BooleanValueDetails.
-func (mr *MockIClientMockRecorder) BooleanValueDetails(ctx, flag, defaultValue, evalCtx interface{}, options ...interface{}) *gomock.Call {
+func (mr *MockIClientMockRecorder) BooleanValueDetails(ctx, flag, defaultValue, evalCtx any, options ...any) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
-	varargs := append([]interface{}{ctx, flag, defaultValue, evalCtx}, options...)
+	varargs := append([]any{ctx, flag, defaultValue, evalCtx}, options...)
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BooleanValueDetails", reflect.TypeOf((*MockIClient)(nil).BooleanValueDetails), varargs...)
 }
 
@@ -324,7 +333,7 @@ func (mr *MockIClientMockRecorder) EvaluationContext() *gomock.Call {
 // Float mocks base method.
 func (m *MockIClient) Float(ctx context.Context, flag string, defaultValue float64, evalCtx EvaluationContext, options ...Option) float64 {
 	m.ctrl.T.Helper()
-	varargs := []interface{}{ctx, flag, defaultValue, evalCtx}
+	varargs := []any{ctx, flag, defaultValue, evalCtx}
 	for _, a := range options {
 		varargs = append(varargs, a)
 	}
@@ -334,16 +343,16 @@ func (m *MockIClient) Float(ctx context.Context, flag string, defaultValue float
 }
 
 // Float indicates an expected call of Float.
-func (mr *MockIClientMockRecorder) Float(ctx, flag, defaultValue, evalCtx interface{}, options ...interface{}) *gomock.Call {
+func (mr *MockIClientMockRecorder) Float(ctx, flag, defaultValue, evalCtx any, options ...any) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
-	varargs := append([]interface{}{ctx, flag, defaultValue, evalCtx}, options...)
+	varargs := append([]any{ctx, flag, defaultValue, evalCtx}, options...)
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Float", reflect.TypeOf((*MockIClient)(nil).Float), varargs...)
 }
 
 // FloatValue mocks base method.
 func (m *MockIClient) FloatValue(ctx context.Context, flag string, defaultValue float64, evalCtx EvaluationContext, options ...Option) (float64, error) {
 	m.ctrl.T.Helper()
-	varargs := []interface{}{ctx, flag, defaultValue, evalCtx}
+	varargs := []any{ctx, flag, defaultValue, evalCtx}
 	for _, a := range options {
 		varargs = append(varargs, a)
 	}
@@ -354,16 +363,16 @@ func (m *MockIClient) FloatValue(ctx context.Context, flag string, defaultValue
 }
 
 // FloatValue indicates an expected call of FloatValue.
-func (mr *MockIClientMockRecorder) FloatValue(ctx, flag, defaultValue, evalCtx interface{}, options ...interface{}) *gomock.Call {
+func (mr *MockIClientMockRecorder) FloatValue(ctx, flag, defaultValue, evalCtx any, options ...any) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
-	varargs := append([]interface{}{ctx, flag, defaultValue, evalCtx}, options...)
+	varargs := append([]any{ctx, flag, defaultValue, evalCtx}, options...)
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FloatValue", reflect.TypeOf((*MockIClient)(nil).FloatValue), varargs...)
 }
 
 // FloatValueDetails mocks base method.
 func (m *MockIClient) FloatValueDetails(ctx context.Context, flag string, defaultValue float64, evalCtx EvaluationContext, options ...Option) (FloatEvaluationDetails, error) {
 	m.ctrl.T.Helper()
-	varargs := []interface{}{ctx, flag, defaultValue, evalCtx}
+	varargs := []any{ctx, flag, defaultValue, evalCtx}
 	for _, a := range options {
 		varargs = append(varargs, a)
 	}
@@ -374,16 +383,16 @@ func (m *MockIClient) FloatValueDetails(ctx context.Context, flag string, defaul
 }
 
 // FloatValueDetails indicates an expected call of FloatValueDetails.
-func (mr *MockIClientMockRecorder) FloatValueDetails(ctx, flag, defaultValue, evalCtx interface{}, options ...interface{}) *gomock.Call {
+func (mr *MockIClientMockRecorder) FloatValueDetails(ctx, flag, defaultValue, evalCtx any, options ...any) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
-	varargs := append([]interface{}{ctx, flag, defaultValue, evalCtx}, options...)
+	varargs := append([]any{ctx, flag, defaultValue, evalCtx}, options...)
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FloatValueDetails", reflect.TypeOf((*MockIClient)(nil).FloatValueDetails), varargs...)
 }
 
 // Int mocks base method.
 func (m *MockIClient) Int(ctx context.Context, flag string, defaultValue int64, evalCtx EvaluationContext, options ...Option) int64 {
 	m.ctrl.T.Helper()
-	varargs := []interface{}{ctx, flag, defaultValue, evalCtx}
+	varargs := []any{ctx, flag, defaultValue, evalCtx}
 	for _, a := range options {
 		varargs = append(varargs, a)
 	}
@@ -393,16 +402,16 @@ func (m *MockIClient) Int(ctx context.Context, flag string, defaultValue int64,
 }
 
 // Int indicates an expected call of Int.
-func (mr *MockIClientMockRecorder) Int(ctx, flag, defaultValue, evalCtx interface{}, options ...interface{}) *gomock.Call {
+func (mr *MockIClientMockRecorder) Int(ctx, flag, defaultValue, evalCtx any, options ...any) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
-	varargs := append([]interface{}{ctx, flag, defaultValue, evalCtx}, options...)
+	varargs := append([]any{ctx, flag, defaultValue, evalCtx}, options...)
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Int", reflect.TypeOf((*MockIClient)(nil).Int), varargs...)
 }
 
 // IntValue mocks base method.
 func (m *MockIClient) IntValue(ctx context.Context, flag string, defaultValue int64, evalCtx EvaluationContext, options ...Option) (int64, error) {
 	m.ctrl.T.Helper()
-	varargs := []interface{}{ctx, flag, defaultValue, evalCtx}
+	varargs := []any{ctx, flag, defaultValue, evalCtx}
 	for _, a := range options {
 		varargs = append(varargs, a)
 	}
@@ -413,16 +422,16 @@ func (m *MockIClient) IntValue(ctx context.Context, flag string, defaultValue in
 }
 
 // IntValue indicates an expected call of IntValue.
-func (mr *MockIClientMockRecorder) IntValue(ctx, flag, defaultValue, evalCtx interface{}, options ...interface{}) *gomock.Call {
+func (mr *MockIClientMockRecorder) IntValue(ctx, flag, defaultValue, evalCtx any, options ...any) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
-	varargs := append([]interface{}{ctx, flag, defaultValue, evalCtx}, options...)
+	varargs := append([]any{ctx, flag, defaultValue, evalCtx}, options...)
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IntValue", reflect.TypeOf((*MockIClient)(nil).IntValue), varargs...)
 }
 
 // IntValueDetails mocks base method.
 func (m *MockIClient) IntValueDetails(ctx context.Context, flag string, defaultValue int64, evalCtx EvaluationContext, options ...Option) (IntEvaluationDetails, error) {
 	m.ctrl.T.Helper()
-	varargs := []interface{}{ctx, flag, defaultValue, evalCtx}
+	varargs := []any{ctx, flag, defaultValue, evalCtx}
 	for _, a := range options {
 		varargs = append(varargs, a)
 	}
@@ -433,9 +442,9 @@ func (m *MockIClient) IntValueDetails(ctx context.Context, flag string, defaultV
 }
 
 // IntValueDetails indicates an expected call of IntValueDetails.
-func (mr *MockIClientMockRecorder) IntValueDetails(ctx, flag, defaultValue, evalCtx interface{}, options ...interface{}) *gomock.Call {
+func (mr *MockIClientMockRecorder) IntValueDetails(ctx, flag, defaultValue, evalCtx any, options ...any) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
-	varargs := append([]interface{}{ctx, flag, defaultValue, evalCtx}, options...)
+	varargs := append([]any{ctx, flag, defaultValue, evalCtx}, options...)
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IntValueDetails", reflect.TypeOf((*MockIClient)(nil).IntValueDetails), varargs...)
 }
 
@@ -454,48 +463,48 @@ func (mr *MockIClientMockRecorder) Metadata() *gomock.Call {
 }
 
 // Object mocks base method.
-func (m *MockIClient) Object(ctx context.Context, flag string, defaultValue interface{}, evalCtx EvaluationContext, options ...Option) interface{} {
+func (m *MockIClient) Object(ctx context.Context, flag string, defaultValue any, evalCtx EvaluationContext, options ...Option) any {
 	m.ctrl.T.Helper()
-	varargs := []interface{}{ctx, flag, defaultValue, evalCtx}
+	varargs := []any{ctx, flag, defaultValue, evalCtx}
 	for _, a := range options {
 		varargs = append(varargs, a)
 	}
 	ret := m.ctrl.Call(m, "Object", varargs...)
-	ret0, _ := ret[0].(interface{})
+	ret0, _ := ret[0].(any)
 	return ret0
 }
 
 // Object indicates an expected call of Object.
-func (mr *MockIClientMockRecorder) Object(ctx, flag, defaultValue, evalCtx interface{}, options ...interface{}) *gomock.Call {
+func (mr *MockIClientMockRecorder) Object(ctx, flag, defaultValue, evalCtx any, options ...any) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
-	varargs := append([]interface{}{ctx, flag, defaultValue, evalCtx}, options...)
+	varargs := append([]any{ctx, flag, defaultValue, evalCtx}, options...)
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Object", reflect.TypeOf((*MockIClient)(nil).Object), varargs...)
 }
 
 // ObjectValue mocks base method.
-func (m *MockIClient) ObjectValue(ctx context.Context, flag string, defaultValue interface{}, evalCtx EvaluationContext, options ...Option) (interface{}, error) {
+func (m *MockIClient) ObjectValue(ctx context.Context, flag string, defaultValue any, evalCtx EvaluationContext, options ...Option) (any, error) {
 	m.ctrl.T.Helper()
-	varargs := []interface{}{ctx, flag, defaultValue, evalCtx}
+	varargs := []any{ctx, flag, defaultValue, evalCtx}
 	for _, a := range options {
 		varargs = append(varargs, a)
 	}
 	ret := m.ctrl.Call(m, "ObjectValue", varargs...)
-	ret0, _ := ret[0].(interface{})
+	ret0, _ := ret[0].(any)
 	ret1, _ := ret[1].(error)
 	return ret0, ret1
 }
 
 // ObjectValue indicates an expected call of ObjectValue.
-func (mr *MockIClientMockRecorder) ObjectValue(ctx, flag, defaultValue, evalCtx interface{}, options ...interface{}) *gomock.Call {
+func (mr *MockIClientMockRecorder) ObjectValue(ctx, flag, defaultValue, evalCtx any, options ...any) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
-	varargs := append([]interface{}{ctx, flag, defaultValue, evalCtx}, options...)
+	varargs := append([]any{ctx, flag, defaultValue, evalCtx}, options...)
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ObjectValue", reflect.TypeOf((*MockIClient)(nil).ObjectValue), varargs...)
 }
 
 // ObjectValueDetails mocks base method.
-func (m *MockIClient) ObjectValueDetails(ctx context.Context, flag string, defaultValue interface{}, evalCtx EvaluationContext, options ...Option) (InterfaceEvaluationDetails, error) {
+func (m *MockIClient) ObjectValueDetails(ctx context.Context, flag string, defaultValue any, evalCtx EvaluationContext, options ...Option) (InterfaceEvaluationDetails, error) {
 	m.ctrl.T.Helper()
-	varargs := []interface{}{ctx, flag, defaultValue, evalCtx}
+	varargs := []any{ctx, flag, defaultValue, evalCtx}
 	for _, a := range options {
 		varargs = append(varargs, a)
 	}
@@ -506,9 +515,9 @@ func (m *MockIClient) ObjectValueDetails(ctx context.Context, flag string, defau
 }
 
 // ObjectValueDetails indicates an expected call of ObjectValueDetails.
-func (mr *MockIClientMockRecorder) ObjectValueDetails(ctx, flag, defaultValue, evalCtx interface{}, options ...interface{}) *gomock.Call {
+func (mr *MockIClientMockRecorder) ObjectValueDetails(ctx, flag, defaultValue, evalCtx any, options ...any) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
-	varargs := append([]interface{}{ctx, flag, defaultValue, evalCtx}, options...)
+	varargs := append([]any{ctx, flag, defaultValue, evalCtx}, options...)
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ObjectValueDetails", reflect.TypeOf((*MockIClient)(nil).ObjectValueDetails), varargs...)
 }
 
@@ -519,7 +528,7 @@ func (m *MockIClient) RemoveHandler(eventType EventType, callback EventCallback)
 }
 
 // RemoveHandler indicates an expected call of RemoveHandler.
-func (mr *MockIClientMockRecorder) RemoveHandler(eventType, callback interface{}) *gomock.Call {
+func (mr *MockIClientMockRecorder) RemoveHandler(eventType, callback any) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RemoveHandler", reflect.TypeOf((*MockIClient)(nil).RemoveHandler), eventType, callback)
 }
@@ -531,7 +540,7 @@ func (m *MockIClient) SetEvaluationContext(evalCtx EvaluationContext) {
 }
 
 // SetEvaluationContext indicates an expected call of SetEvaluationContext.
-func (mr *MockIClientMockRecorder) SetEvaluationContext(evalCtx interface{}) *gomock.Call {
+func (mr *MockIClientMockRecorder) SetEvaluationContext(evalCtx any) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetEvaluationContext", reflect.TypeOf((*MockIClient)(nil).SetEvaluationContext), evalCtx)
 }
@@ -553,7 +562,7 @@ func (mr *MockIClientMockRecorder) State() *gomock.Call {
 // String mocks base method.
 func (m *MockIClient) String(ctx context.Context, flag, defaultValue string, evalCtx EvaluationContext, options ...Option) string {
 	m.ctrl.T.Helper()
-	varargs := []interface{}{ctx, flag, defaultValue, evalCtx}
+	varargs := []any{ctx, flag, defaultValue, evalCtx}
 	for _, a := range options {
 		varargs = append(varargs, a)
 	}
@@ -563,16 +572,16 @@ func (m *MockIClient) String(ctx context.Context, flag, defaultValue string, eva
 }
 
 // String indicates an expected call of String.
-func (mr *MockIClientMockRecorder) String(ctx, flag, defaultValue, evalCtx interface{}, options ...interface{}) *gomock.Call {
+func (mr *MockIClientMockRecorder) String(ctx, flag, defaultValue, evalCtx any, options ...any) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
-	varargs := append([]interface{}{ctx, flag, defaultValue, evalCtx}, options...)
+	varargs := append([]any{ctx, flag, defaultValue, evalCtx}, options...)
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "String", reflect.TypeOf((*MockIClient)(nil).String), varargs...)
 }
 
 // StringValue mocks base method.
 func (m *MockIClient) StringValue(ctx context.Context, flag, defaultValue string, evalCtx EvaluationContext, options ...Option) (string, error) {
 	m.ctrl.T.Helper()
-	varargs := []interface{}{ctx, flag, defaultValue, evalCtx}
+	varargs := []any{ctx, flag, defaultValue, evalCtx}
 	for _, a := range options {
 		varargs = append(varargs, a)
 	}
@@ -583,16 +592,16 @@ func (m *MockIClient) StringValue(ctx context.Context, flag, defaultValue string
 }
 
 // StringValue indicates an expected call of StringValue.
-func (mr *MockIClientMockRecorder) StringValue(ctx, flag, defaultValue, evalCtx interface{}, options ...interface{}) *gomock.Call {
+func (mr *MockIClientMockRecorder) StringValue(ctx, flag, defaultValue, evalCtx any, options ...any) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
-	varargs := append([]interface{}{ctx, flag, defaultValue, evalCtx}, options...)
+	varargs := append([]any{ctx, flag, defaultValue, evalCtx}, options...)
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StringValue", reflect.TypeOf((*MockIClient)(nil).StringValue), varargs...)
 }
 
 // StringValueDetails mocks base method.
 func (m *MockIClient) StringValueDetails(ctx context.Context, flag, defaultValue string, evalCtx EvaluationContext, options ...Option) (StringEvaluationDetails, error) {
 	m.ctrl.T.Helper()
-	varargs := []interface{}{ctx, flag, defaultValue, evalCtx}
+	varargs := []any{ctx, flag, defaultValue, evalCtx}
 	for _, a := range options {
 		varargs = append(varargs, a)
 	}
@@ -603,9 +612,9 @@ func (m *MockIClient) StringValueDetails(ctx context.Context, flag, defaultValue
 }
 
 // StringValueDetails indicates an expected call of StringValueDetails.
-func (mr *MockIClientMockRecorder) StringValueDetails(ctx, flag, defaultValue, evalCtx interface{}, options ...interface{}) *gomock.Call {
+func (mr *MockIClientMockRecorder) StringValueDetails(ctx, flag, defaultValue, evalCtx any, options ...any) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
-	varargs := append([]interface{}{ctx, flag, defaultValue, evalCtx}, options...)
+	varargs := append([]any{ctx, flag, defaultValue, evalCtx}, options...)
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StringValueDetails", reflect.TypeOf((*MockIClient)(nil).StringValueDetails), varargs...)
 }
 
@@ -616,7 +625,7 @@ func (m *MockIClient) Track(ctx context.Context, trackingEventName string, evalC
 }
 
 // Track indicates an expected call of Track.
-func (mr *MockIClientMockRecorder) Track(ctx, trackingEventName, evalCtx, details interface{}) *gomock.Call {
+func (mr *MockIClientMockRecorder) Track(ctx, trackingEventName, evalCtx, details any) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Track", reflect.TypeOf((*MockIClient)(nil).Track), ctx, trackingEventName, evalCtx, details)
 }
@@ -625,6 +634,7 @@ func (mr *MockIClientMockRecorder) Track(ctx, trackingEventName, evalCtx, detail
 type MockIEventing struct {
 	ctrl     *gomock.Controller
 	recorder *MockIEventingMockRecorder
+	isgomock struct{}
 }
 
 // MockIEventingMockRecorder is the mock recorder for MockIEventing.
@@ -651,7 +661,7 @@ func (m *MockIEventing) AddHandler(eventType EventType, callback EventCallback)
 }
 
 // AddHandler indicates an expected call of AddHandler.
-func (mr *MockIEventingMockRecorder) AddHandler(eventType, callback interface{}) *gomock.Call {
+func (mr *MockIEventingMockRecorder) AddHandler(eventType, callback any) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddHandler", reflect.TypeOf((*MockIEventing)(nil).AddHandler), eventType, callback)
 }
@@ -663,7 +673,7 @@ func (m *MockIEventing) RemoveHandler(eventType EventType, callback EventCallbac
 }
 
 // RemoveHandler indicates an expected call of RemoveHandler.
-func (mr *MockIEventingMockRecorder) RemoveHandler(eventType, callback interface{}) *gomock.Call {
+func (mr *MockIEventingMockRecorder) RemoveHandler(eventType, callback any) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RemoveHandler", reflect.TypeOf((*MockIEventing)(nil).RemoveHandler), eventType, callback)
 }
@@ -672,6 +682,7 @@ func (mr *MockIEventingMockRecorder) RemoveHandler(eventType, callback interface
 type MockITracking struct {
 	ctrl     *gomock.Controller
 	recorder *MockITrackingMockRecorder
+	isgomock struct{}
 }
 
 // MockITrackingMockRecorder is the mock recorder for MockITracking.
@@ -698,7 +709,7 @@ func (m *MockITracking) Track(ctx context.Context, trackingEventName string, eva
 }
 
 // Track indicates an expected call of Track.
-func (mr *MockITrackingMockRecorder) Track(ctx, trackingEventName, evalCtx, details interface{}) *gomock.Call {
+func (mr *MockITrackingMockRecorder) Track(ctx, trackingEventName, evalCtx, details any) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Track", reflect.TypeOf((*MockITracking)(nil).Track), ctx, trackingEventName, evalCtx, details)
 }
@@ -707,6 +718,7 @@ func (mr *MockITrackingMockRecorder) Track(ctx, trackingEventName, evalCtx, deta
 type MockevaluationImpl struct {
 	ctrl     *gomock.Controller
 	recorder *MockevaluationImplMockRecorder
+	isgomock struct{}
 }
 
 // MockevaluationImplMockRecorder is the mock recorder for MockevaluationImpl.
@@ -733,7 +745,7 @@ func (m *MockevaluationImpl) AddHandler(eventType EventType, callback EventCallb
 }
 
 // AddHandler indicates an expected call of AddHandler.
-func (mr *MockevaluationImplMockRecorder) AddHandler(eventType, callback interface{}) *gomock.Call {
+func (mr *MockevaluationImplMockRecorder) AddHandler(eventType, callback any) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddHandler", reflect.TypeOf((*MockevaluationImpl)(nil).AddHandler), eventType, callback)
 }
@@ -741,7 +753,7 @@ func (mr *MockevaluationImplMockRecorder) AddHandler(eventType, callback interfa
 // AddHooks mocks base method.
 func (m *MockevaluationImpl) AddHooks(hooks ...Hook) {
 	m.ctrl.T.Helper()
-	varargs := []interface{}{}
+	varargs := []any{}
 	for _, a := range hooks {
 		varargs = append(varargs, a)
 	}
@@ -749,7 +761,7 @@ func (m *MockevaluationImpl) AddHooks(hooks ...Hook) {
 }
 
 // AddHooks indicates an expected call of AddHooks.
-func (mr *MockevaluationImplMockRecorder) AddHooks(hooks ...interface{}) *gomock.Call {
+func (mr *MockevaluationImplMockRecorder) AddHooks(hooks ...any) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddHooks", reflect.TypeOf((*MockevaluationImpl)(nil).AddHooks), hooks...)
 }
@@ -765,7 +777,7 @@ func (m *MockevaluationImpl) ForEvaluation(clientName string) (FeatureProvider,
 }
 
 // ForEvaluation indicates an expected call of ForEvaluation.
-func (mr *MockevaluationImplMockRecorder) ForEvaluation(clientName interface{}) *gomock.Call {
+func (mr *MockevaluationImplMockRecorder) ForEvaluation(clientName any) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ForEvaluation", reflect.TypeOf((*MockevaluationImpl)(nil).ForEvaluation), clientName)
 }
@@ -807,7 +819,7 @@ func (m *MockevaluationImpl) GetNamedClient(clientName string) IClient {
 }
 
 // GetNamedClient indicates an expected call of GetNamedClient.
-func (mr *MockevaluationImplMockRecorder) GetNamedClient(clientName interface{}) *gomock.Call {
+func (mr *MockevaluationImplMockRecorder) GetNamedClient(clientName any) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetNamedClient", reflect.TypeOf((*MockevaluationImpl)(nil).GetNamedClient), clientName)
 }
@@ -821,7 +833,7 @@ func (m *MockevaluationImpl) GetNamedProviderMetadata(name string) Metadata {
 }
 
 // GetNamedProviderMetadata indicates an expected call of GetNamedProviderMetadata.
-func (mr *MockevaluationImplMockRecorder) GetNamedProviderMetadata(name interface{}) *gomock.Call {
+func (mr *MockevaluationImplMockRecorder) GetNamedProviderMetadata(name any) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetNamedProviderMetadata", reflect.TypeOf((*MockevaluationImpl)(nil).GetNamedProviderMetadata), name)
 }
@@ -875,7 +887,7 @@ func (m *MockevaluationImpl) RemoveHandler(eventType EventType, callback EventCa
 }
 
 // RemoveHandler indicates an expected call of RemoveHandler.
-func (mr *MockevaluationImplMockRecorder) RemoveHandler(eventType, callback interface{}) *gomock.Call {
+func (mr *MockevaluationImplMockRecorder) RemoveHandler(eventType, callback any) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RemoveHandler", reflect.TypeOf((*MockevaluationImpl)(nil).RemoveHandler), eventType, callback)
 }
@@ -887,7 +899,7 @@ func (m *MockevaluationImpl) SetEvaluationContext(apiCtx EvaluationContext) {
 }
 
 // SetEvaluationContext indicates an expected call of SetEvaluationContext.
-func (mr *MockevaluationImplMockRecorder) SetEvaluationContext(apiCtx interface{}) *gomock.Call {
+func (mr *MockevaluationImplMockRecorder) SetEvaluationContext(apiCtx any) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetEvaluationContext", reflect.TypeOf((*MockevaluationImpl)(nil).SetEvaluationContext), apiCtx)
 }
@@ -899,7 +911,7 @@ func (m *MockevaluationImpl) SetLogger(l logr.Logger) {
 }
 
 // SetLogger indicates an expected call of SetLogger.
-func (mr *MockevaluationImplMockRecorder) SetLogger(l interface{}) *gomock.Call {
+func (mr *MockevaluationImplMockRecorder) SetLogger(l any) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetLogger", reflect.TypeOf((*MockevaluationImpl)(nil).SetLogger), l)
 }
@@ -913,7 +925,7 @@ func (m *MockevaluationImpl) SetNamedProvider(clientName string, provider Featur
 }
 
 // SetNamedProvider indicates an expected call of SetNamedProvider.
-func (mr *MockevaluationImplMockRecorder) SetNamedProvider(clientName, provider, async interface{}) *gomock.Call {
+func (mr *MockevaluationImplMockRecorder) SetNamedProvider(clientName, provider, async any) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetNamedProvider", reflect.TypeOf((*MockevaluationImpl)(nil).SetNamedProvider), clientName, provider, async)
 }
@@ -927,7 +939,7 @@ func (m *MockevaluationImpl) SetProvider(provider FeatureProvider) error {
 }
 
 // SetProvider indicates an expected call of SetProvider.
-func (mr *MockevaluationImplMockRecorder) SetProvider(provider interface{}) *gomock.Call {
+func (mr *MockevaluationImplMockRecorder) SetProvider(provider any) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetProvider", reflect.TypeOf((*MockevaluationImpl)(nil).SetProvider), provider)
 }
@@ -941,7 +953,7 @@ func (m *MockevaluationImpl) SetProviderAndWait(provider FeatureProvider) error
 }
 
 // SetProviderAndWait indicates an expected call of SetProviderAndWait.
-func (mr *MockevaluationImplMockRecorder) SetProviderAndWait(provider interface{}) *gomock.Call {
+func (mr *MockevaluationImplMockRecorder) SetProviderAndWait(provider any) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetProviderAndWait", reflect.TypeOf((*MockevaluationImpl)(nil).SetProviderAndWait), provider)
 }
@@ -962,6 +974,7 @@ func (mr *MockevaluationImplMockRecorder) Shutdown() *gomock.Call {
 type MockeventingImpl struct {
 	ctrl     *gomock.Controller
 	recorder *MockeventingImplMockRecorder
+	isgomock struct{}
 }
 
 // MockeventingImplMockRecorder is the mock recorder for MockeventingImpl.
@@ -988,7 +1001,7 @@ func (m *MockeventingImpl) AddClientHandler(clientName string, t EventType, c Ev
 }
 
 // AddClientHandler indicates an expected call of AddClientHandler.
-func (mr *MockeventingImplMockRecorder) AddClientHandler(clientName, t, c interface{}) *gomock.Call {
+func (mr *MockeventingImplMockRecorder) AddClientHandler(clientName, t, c any) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddClientHandler", reflect.TypeOf((*MockeventingImpl)(nil).AddClientHandler), clientName, t, c)
 }
@@ -1000,7 +1013,7 @@ func (m *MockeventingImpl) AddHandler(eventType EventType, callback EventCallbac
 }
 
 // AddHandler indicates an expected call of AddHandler.
-func (mr *MockeventingImplMockRecorder) AddHandler(eventType, callback interface{}) *gomock.Call {
+func (mr *MockeventingImplMockRecorder) AddHandler(eventType, callback any) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddHandler", reflect.TypeOf((*MockeventingImpl)(nil).AddHandler), eventType, callback)
 }
@@ -1028,7 +1041,7 @@ func (m *MockeventingImpl) GetClientRegistry(client string) scopedCallback {
 }
 
 // GetClientRegistry indicates an expected call of GetClientRegistry.
-func (mr *MockeventingImplMockRecorder) GetClientRegistry(client interface{}) *gomock.Call {
+func (mr *MockeventingImplMockRecorder) GetClientRegistry(client any) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetClientRegistry", reflect.TypeOf((*MockeventingImpl)(nil).GetClientRegistry), client)
 }
@@ -1040,7 +1053,7 @@ func (m *MockeventingImpl) RemoveClientHandler(name string, t EventType, c Event
 }
 
 // RemoveClientHandler indicates an expected call of RemoveClientHandler.
-func (mr *MockeventingImplMockRecorder) RemoveClientHandler(name, t, c interface{}) *gomock.Call {
+func (mr *MockeventingImplMockRecorder) RemoveClientHandler(name, t, c any) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RemoveClientHandler", reflect.TypeOf((*MockeventingImpl)(nil).RemoveClientHandler), name, t, c)
 }
@@ -1052,7 +1065,7 @@ func (m *MockeventingImpl) RemoveHandler(eventType EventType, callback EventCall
 }
 
 // RemoveHandler indicates an expected call of RemoveHandler.
-func (mr *MockeventingImplMockRecorder) RemoveHandler(eventType, callback interface{}) *gomock.Call {
+func (mr *MockeventingImplMockRecorder) RemoveHandler(eventType, callback any) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RemoveHandler", reflect.TypeOf((*MockeventingImpl)(nil).RemoveHandler), eventType, callback)
 }
@@ -1066,7 +1079,7 @@ func (m *MockeventingImpl) State(domain string) State {
 }
 
 // State indicates an expected call of State.
-func (mr *MockeventingImplMockRecorder) State(domain interface{}) *gomock.Call {
+func (mr *MockeventingImplMockRecorder) State(domain any) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "State", reflect.TypeOf((*MockeventingImpl)(nil).State), domain)
 }
@@ -1075,6 +1088,7 @@ func (mr *MockeventingImplMockRecorder) State(domain interface{}) *gomock.Call {
 type MockclientEvent struct {
 	ctrl     *gomock.Controller
 	recorder *MockclientEventMockRecorder
+	isgomock struct{}
 }
 
 // MockclientEventMockRecorder is the mock recorder for MockclientEvent.
@@ -1101,7 +1115,7 @@ func (m *MockclientEvent) AddClientHandler(clientName string, t EventType, c Eve
 }
 
 // AddClientHandler indicates an expected call of AddClientHandler.
-func (mr *MockclientEventMockRecorder) AddClientHandler(clientName, t, c interface{}) *gomock.Call {
+func (mr *MockclientEventMockRecorder) AddClientHandler(clientName, t, c any) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddClientHandler", reflect.TypeOf((*MockclientEvent)(nil).AddClientHandler), clientName, t, c)
 }
@@ -1113,7 +1127,7 @@ func (m *MockclientEvent) RemoveClientHandler(name string, t EventType, c EventC
 }
 
 // RemoveClientHandler indicates an expected call of RemoveClientHandler.
-func (mr *MockclientEventMockRecorder) RemoveClientHandler(name, t, c interface{}) *gomock.Call {
+func (mr *MockclientEventMockRecorder) RemoveClientHandler(name, t, c any) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RemoveClientHandler", reflect.TypeOf((*MockclientEvent)(nil).RemoveClientHandler), name, t, c)
 }
@@ -1127,7 +1141,7 @@ func (m *MockclientEvent) State(domain string) State {
 }
 
 // State indicates an expected call of State.
-func (mr *MockclientEventMockRecorder) State(domain interface{}) *gomock.Call {
+func (mr *MockclientEventMockRecorder) State(domain any) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "State", reflect.TypeOf((*MockclientEvent)(nil).State), domain)
 }
diff --git a/openfeature/openfeature_test.go b/openfeature/openfeature_test.go
index b29ea31..ba7642d 100644
--- a/openfeature/openfeature_test.go
+++ b/openfeature/openfeature_test.go
@@ -8,7 +8,7 @@ import (
 	"testing"
 	"time"
 
-	"github.com/golang/mock/gomock"
+	"go.uber.org/mock/gomock"
 )
 
 // The `API`, and any state it maintains SHOULD exist as a global singleton,
diff --git a/openfeature/provider_mock_test.go b/openfeature/provider_mock.go
similarity index 92%
rename from openfeature/provider_mock_test.go
rename to openfeature/provider_mock.go
index ff03c65..8ec6bd9 100644
--- a/openfeature/provider_mock_test.go
+++ b/openfeature/provider_mock.go
@@ -1,5 +1,12 @@
+//go:build testtools
+
 // Code generated by MockGen. DO NOT EDIT.
 // Source: openfeature/provider.go
+//
+// Generated by this command:
+//
+//	mockgen -source=openfeature/provider.go -destination=openfeature/provider_mock.go -package=openfeature
+//
 
 // Package openfeature is a generated GoMock package.
 package openfeature
@@ -8,13 +15,14 @@ import (
 	context "context"
 	reflect "reflect"
 
-	gomock "github.com/golang/mock/gomock"
+	gomock "go.uber.org/mock/gomock"
 )
 
 // MockFeatureProvider is a mock of FeatureProvider interface.
 type MockFeatureProvider struct {
 	ctrl     *gomock.Controller
 	recorder *MockFeatureProviderMockRecorder
+	isgomock struct{}
 }
 
 // MockFeatureProviderMockRecorder is the mock recorder for MockFeatureProvider.
@@ -43,7 +51,7 @@ func (m *MockFeatureProvider) BooleanEvaluation(ctx context.Context, flag string
 }
 
 // BooleanEvaluation indicates an expected call of BooleanEvaluation.
-func (mr *MockFeatureProviderMockRecorder) BooleanEvaluation(ctx, flag, defaultValue, evalCtx interface{}) *gomock.Call {
+func (mr *MockFeatureProviderMockRecorder) BooleanEvaluation(ctx, flag, defaultValue, evalCtx any) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BooleanEvaluation", reflect.TypeOf((*MockFeatureProvider)(nil).BooleanEvaluation), ctx, flag, defaultValue, evalCtx)
 }
@@ -57,7 +65,7 @@ func (m *MockFeatureProvider) FloatEvaluation(ctx context.Context, flag string,
 }
 
 // FloatEvaluation indicates an expected call of FloatEvaluation.
-func (mr *MockFeatureProviderMockRecorder) FloatEvaluation(ctx, flag, defaultValue, evalCtx interface{}) *gomock.Call {
+func (mr *MockFeatureProviderMockRecorder) FloatEvaluation(ctx, flag, defaultValue, evalCtx any) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FloatEvaluation", reflect.TypeOf((*MockFeatureProvider)(nil).FloatEvaluation), ctx, flag, defaultValue, evalCtx)
 }
@@ -85,7 +93,7 @@ func (m *MockFeatureProvider) IntEvaluation(ctx context.Context, flag string, de
 }
 
 // IntEvaluation indicates an expected call of IntEvaluation.
-func (mr *MockFeatureProviderMockRecorder) IntEvaluation(ctx, flag, defaultValue, evalCtx interface{}) *gomock.Call {
+func (mr *MockFeatureProviderMockRecorder) IntEvaluation(ctx, flag, defaultValue, evalCtx any) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IntEvaluation", reflect.TypeOf((*MockFeatureProvider)(nil).IntEvaluation), ctx, flag, defaultValue, evalCtx)
 }
@@ -105,7 +113,7 @@ func (mr *MockFeatureProviderMockRecorder) Metadata() *gomock.Call {
 }
 
 // ObjectEvaluation mocks base method.
-func (m *MockFeatureProvider) ObjectEvaluation(ctx context.Context, flag string, defaultValue interface{}, evalCtx FlattenedContext) InterfaceResolutionDetail {
+func (m *MockFeatureProvider) ObjectEvaluation(ctx context.Context, flag string, defaultValue any, evalCtx FlattenedContext) InterfaceResolutionDetail {
 	m.ctrl.T.Helper()
 	ret := m.ctrl.Call(m, "ObjectEvaluation", ctx, flag, defaultValue, evalCtx)
 	ret0, _ := ret[0].(InterfaceResolutionDetail)
@@ -113,7 +121,7 @@ func (m *MockFeatureProvider) ObjectEvaluation(ctx context.Context, flag string,
 }
 
 // ObjectEvaluation indicates an expected call of ObjectEvaluation.
-func (mr *MockFeatureProviderMockRecorder) ObjectEvaluation(ctx, flag, defaultValue, evalCtx interface{}) *gomock.Call {
+func (mr *MockFeatureProviderMockRecorder) ObjectEvaluation(ctx, flag, defaultValue, evalCtx any) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ObjectEvaluation", reflect.TypeOf((*MockFeatureProvider)(nil).ObjectEvaluation), ctx, flag, defaultValue, evalCtx)
 }
@@ -127,7 +135,7 @@ func (m *MockFeatureProvider) StringEvaluation(ctx context.Context, flag, defaul
 }
 
 // StringEvaluation indicates an expected call of StringEvaluation.
-func (mr *MockFeatureProviderMockRecorder) StringEvaluation(ctx, flag, defaultValue, evalCtx interface{}) *gomock.Call {
+func (mr *MockFeatureProviderMockRecorder) StringEvaluation(ctx, flag, defaultValue, evalCtx any) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StringEvaluation", reflect.TypeOf((*MockFeatureProvider)(nil).StringEvaluation), ctx, flag, defaultValue, evalCtx)
 }
@@ -136,6 +144,7 @@ func (mr *MockFeatureProviderMockRecorder) StringEvaluation(ctx, flag, defaultVa
 type MockStateHandler struct {
 	ctrl     *gomock.Controller
 	recorder *MockStateHandlerMockRecorder
+	isgomock struct{}
 }
 
 // MockStateHandlerMockRecorder is the mock recorder for MockStateHandler.
@@ -164,7 +173,7 @@ func (m *MockStateHandler) Init(evaluationContext EvaluationContext) error {
 }
 
 // Init indicates an expected call of Init.
-func (mr *MockStateHandlerMockRecorder) Init(evaluationContext interface{}) *gomock.Call {
+func (mr *MockStateHandlerMockRecorder) Init(evaluationContext any) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Init", reflect.TypeOf((*MockStateHandler)(nil).Init), evaluationContext)
 }
@@ -185,6 +194,7 @@ func (mr *MockStateHandlerMockRecorder) Shutdown() *gomock.Call {
 type MockTracker struct {
 	ctrl     *gomock.Controller
 	recorder *MockTrackerMockRecorder
+	isgomock struct{}
 }
 
 // MockTrackerMockRecorder is the mock recorder for MockTracker.
@@ -211,7 +221,7 @@ func (m *MockTracker) Track(ctx context.Context, trackingEventName string, evalu
 }
 
 // Track indicates an expected call of Track.
-func (mr *MockTrackerMockRecorder) Track(ctx, trackingEventName, evaluationContext, details interface{}) *gomock.Call {
+func (mr *MockTrackerMockRecorder) Track(ctx, trackingEventName, evaluationContext, details any) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Track", reflect.TypeOf((*MockTracker)(nil).Track), ctx, trackingEventName, evaluationContext, details)
 }
@@ -220,6 +230,7 @@ func (mr *MockTrackerMockRecorder) Track(ctx, trackingEventName, evaluationConte
 type MockEventHandler struct {
 	ctrl     *gomock.Controller
 	recorder *MockEventHandlerMockRecorder
+	isgomock struct{}
 }
 
 // MockEventHandlerMockRecorder is the mock recorder for MockEventHandler.
diff --git a/openfeature/provider_test.go b/openfeature/provider_test.go
index 6935588..6423abe 100644
--- a/openfeature/provider_test.go
+++ b/openfeature/provider_test.go
@@ -5,7 +5,7 @@ import (
 	"reflect"
 	"testing"
 
-	"github.com/golang/mock/gomock"
+	"go.uber.org/mock/gomock"
 )
 
 // The provider interface MUST define a `metadata` member or accessor, containing a `name` field or accessor