Skip to content

Add @MockitoSettings(strictness = Strictness.WARN) for Mockito migration#966

Merged
timtebeek merged 6 commits intomainfrom
bmuschko/mockito-settings-warn
Apr 18, 2026
Merged

Add @MockitoSettings(strictness = Strictness.WARN) for Mockito migration#966
timtebeek merged 6 commits intomainfrom
bmuschko/mockito-settings-warn

Conversation

@bmuschko
Copy link
Copy Markdown
Contributor

@bmuschko bmuschko commented Apr 8, 2026

Context

After migrating from Mockito 1.x, tests fail with UnnecessaryStubbingException because @ExtendWith(MockitoExtension.class) defaults to Strictness.STRICT_STUBS, whereas Mockito 1.x/2.x silently ignored unused stubbings (Strictness.WARN). Detecting which stubbings are truly unnecessary requires runtime analysis, so the practical fix is to add @MockitoSettings(strictness = Strictness.WARN) at the class level to preserve the original behavior.

The existing MockitoJUnitToMockitoExtension recipe already handled this when converting a MockitoRule, but had two gaps:

  1. When @ExtendWith(MockitoExtension.class) was already present alongside a MockitoRule, the recipe removed the rule but did not add @MockitoSettings, silently changing strictness from WARN to STRICT_STUBS.
  2. Classes that were already fully migrated (no MockitoRule remaining, just @ExtendWith) were not covered at all — no existing recipe would add the missing @MockitoSettings.

Changes

  1. MockitoJUnitToMockitoExtension: Decoupled the @ExtendWith and @MockitoSettings logic so that @MockitoSettings is now added even when @ExtendWith is already present (fixes gap 1).

  2. New AddMockitoSettingsWithWarnStrictness recipe: Adds @MockitoSettings(strictness = Strictness.WARN) to classes that have @ExtendWith(MockitoExtension.class) but no @MockitoSettings annotation. This covers classes already migrated without a MockitoRule to convert (fixes gap 2). Added to the Mockito1to3Migration chain.

…o migration

Addresses the UnnecessaryStubbingException issue that occurs after migrating
from Mockito 1.x, where unused stubbings were silently ignored but now fail
under MockitoExtension's default STRICT_STUBS strictness.

Two changes:

1. MockitoJUnitToMockitoExtension now adds @MockitoSettings even when
   @ExtendWith(MockitoExtension.class) is already present, preserving the
   original WARN strictness from the MockitoRule being removed.

2. New AddMockitoSettingsWithWarnStrictness recipe targets classes that
   already have @ExtendWith(MockitoExtension.class) but no MockitoRule
   to convert and no @MockitoSettings — the gap not covered by the
   existing recipe.
@github-project-automation github-project-automation Bot moved this to In Progress in OpenRewrite Apr 8, 2026
@bmuschko bmuschko added the enhancement New feature or request label Apr 8, 2026
Comment thread src/main/resources/META-INF/rewrite/mockito.yml Outdated
@bmuschko
Copy link
Copy Markdown
Contributor Author

bmuschko commented Apr 8, 2026

I'll make this a draft for now. It's still failing on CI anyway.

@bmuschko bmuschko marked this pull request as draft April 8, 2026 22:36
bmuschko and others added 4 commits April 8, 2026 16:38
MockitoBestPractices includes RemoveAnnotation for @MockitoSettings(WARN),
which conflicts with our recipe when both run in the same composite chain
(e.g., JMockitToMockito → MockitoBestPractices → Mockito1to5Migration).
Restore UsesType precondition and remove from Mockito1to3Migration chain.
…ndition

Introduces a declarative YAML wrapper
`AddMockitoSettingsWithWarnStrictnessForLegacyMockito` that applies the
underlying recipe only when the module depends on Mockito < 3.0. This
avoids adding `@MockitoSettings(strictness = Strictness.WARN)` for
projects that never used pre-3 Mockito defaults, while still preserving
lenient behavior for Mockito 1.x/2.x migrations.
Consolidate RunWith, ExtendWith, and MockitoSettings logic behind a
single FindAnnotations check, move maybeAddImport calls next to their
templates, and use a static import for Comparator.comparing.
@timtebeek timtebeek marked this pull request as ready for review April 18, 2026 10:18
Copy link
Copy Markdown
Member

@timtebeek timtebeek left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for catching these cases with the preconditioned addition!

@github-project-automation github-project-automation Bot moved this from In Progress to Ready to Review in OpenRewrite Apr 18, 2026
@timtebeek timtebeek merged commit e09430b into main Apr 18, 2026
1 check passed
@timtebeek timtebeek deleted the bmuschko/mockito-settings-warn branch April 18, 2026 10:32
@github-project-automation github-project-automation Bot moved this from Ready to Review to Done in OpenRewrite Apr 18, 2026
mergify Bot added a commit to robfrank/linklift that referenced this pull request May 3, 2026
…rom 3.30.0 to 3.35.2 [skip ci]

Bumps [org.openrewrite.recipe:rewrite-testing-frameworks](https://github.com/openrewrite/rewrite-testing-frameworks) from 3.30.0 to 3.35.2.
Release notes

*Sourced from [org.openrewrite.recipe:rewrite-testing-frameworks's releases](https://github.com/openrewrite/rewrite-testing-frameworks/releases).*

> 3.35.2
> ------
>
> What's Changed
> --------------
>
> * OpenRewrite v8.81.0: <openrewrite/rewrite@v8.81.0...main>
>
> **Full Changelog**: <openrewrite/rewrite-testing-frameworks@v3.35.1...v3.35.2>
>
> 3.35.1
> ------
>
> What's Changed
> --------------
>
> * Fix `UpdateMockWebServerDispatcher` classpath lookup by [`@​knutwannheden`](https://github.com/knutwannheden) in [openrewrite/rewrite-testing-frameworks#975](https://redirect.github.com/openrewrite/rewrite-testing-frameworks/pull/975)
>
> **Full Changelog**: <openrewrite/rewrite-testing-frameworks@v3.35.0...v3.35.1>
>
> 3.35.0
> ------
>
> What's Changed
> --------------
>
> * Skip FieldAccess arguments in AssertThrowsOnLastStatement by [`@​timtebeek`](https://github.com/timtebeek) in [openrewrite/rewrite-testing-frameworks#965](https://redirect.github.com/openrewrite/rewrite-testing-frameworks/pull/965)
> * Add MigrateToKafkaNative recipe for Testcontainers ([#568](https://redirect.github.com/openrewrite/rewrite-testing-frameworks/issues/568)) by [`@​timtebeek`](https://github.com/timtebeek) in [openrewrite/rewrite-testing-frameworks#967](https://redirect.github.com/openrewrite/rewrite-testing-frameworks/pull/967)
> * Fix ClassCastException in RemoveTimesZeroAndOne by [`@​timtebeek`](https://github.com/timtebeek) in [openrewrite/rewrite-testing-frameworks#969](https://redirect.github.com/openrewrite/rewrite-testing-frameworks/pull/969)
> * Fix RemoveTryCatchFailBlocks failing when removing blocks within lambda expressions by [`@​sambsnyd`](https://github.com/sambsnyd) in [openrewrite/rewrite-testing-frameworks#970](https://redirect.github.com/openrewrite/rewrite-testing-frameworks/pull/970)
> * Use KotlinTypeUtils.isKotlinUnit to match Kotlin void return types by [`@​timtebeek`](https://github.com/timtebeek) in [openrewrite/rewrite-testing-frameworks#971](https://redirect.github.com/openrewrite/rewrite-testing-frameworks/pull/971)
> * Fix MockWebServer Dispatcher return type and RecordedRequest renames by [`@​timtebeek`](https://github.com/timtebeek) in [openrewrite/rewrite-testing-frameworks#972](https://redirect.github.com/openrewrite/rewrite-testing-frameworks/pull/972)
> * Add [`@​MockitoSettings`](https://github.com/MockitoSettings)(strictness = Strictness.WARN) for Mockito migration by [`@​bmuschko`](https://github.com/bmuschko) in [openrewrite/rewrite-testing-frameworks#966](https://redirect.github.com/openrewrite/rewrite-testing-frameworks/pull/966)
>
> **Full Changelog**: <openrewrite/rewrite-testing-frameworks@v3.34.0...v3.35.0>
>
> 3.34.0
> ------
>
> What's Changed
> --------------
>
> * Remove empty if blocks after initMocks/openMocks cleanup by [`@​timtebeek`](https://github.com/timtebeek) in [openrewrite/rewrite-testing-frameworks#952](https://redirect.github.com/openrewrite/rewrite-testing-frameworks/pull/952)
> * Extend SimplifyMockitoVerifyWhenGiven for more S6068 cases by [`@​timtebeek`](https://github.com/timtebeek) in [openrewrite/rewrite-testing-frameworks#953](https://redirect.github.com/openrewrite/rewrite-testing-frameworks/pull/953)
> * Add RemoveDoNothingForDefaultMocks to Mockito1to3Migration by [`@​bmuschko`](https://github.com/bmuschko) in [openrewrite/rewrite-testing-frameworks#956](https://redirect.github.com/openrewrite/rewrite-testing-frameworks/pull/956)
> * Skip private method stubbing in PowerMockitoDoStubbingToMockito by [`@​bmuschko`](https://github.com/bmuschko) in [openrewrite/rewrite-testing-frameworks#957](https://redirect.github.com/openrewrite/rewrite-testing-frameworks/pull/957)
> * Fix AssertToAssertionsTest expectations for static imports by [`@​timtebeek`](https://github.com/timtebeek) in [openrewrite/rewrite-testing-frameworks#958](https://redirect.github.com/openrewrite/rewrite-testing-frameworks/pull/958)
> * Add ThenThrowCheckedExceptionToRuntimeException recipe by [`@​bmuschko`](https://github.com/bmuschko) in [openrewrite/rewrite-testing-frameworks#954](https://redirect.github.com/openrewrite/rewrite-testing-frameworks/pull/954)
> * Fix AnyToNullable removing any() import when untyped any() still used by [`@​timtebeek`](https://github.com/timtebeek) in [openrewrite/rewrite-testing-frameworks#960](https://redirect.github.com/openrewrite/rewrite-testing-frameworks/pull/960)
> * Rename implicit [`@​MethodSource`](https://github.com/MethodSource) methods in RemoveTestPrefix by [`@​timtebeek`](https://github.com/timtebeek) in [openrewrite/rewrite-testing-frameworks#961](https://redirect.github.com/openrewrite/rewrite-testing-frameworks/pull/961)
> * Add UpgradeWiremockDependencyVersion recipe by [`@​timtebeek`](https://github.com/timtebeek) in [openrewrite/rewrite-testing-frameworks#963](https://redirect.github.com/openrewrite/rewrite-testing-frameworks/pull/963)
> * Support intermediate methods in SimplifyChainedAssertJAssertion by [`@​timtebeek`](https://github.com/timtebeek) in [openrewrite/rewrite-testing-frameworks#962](https://redirect.github.com/openrewrite/rewrite-testing-frameworks/pull/962)
> * Add MigrateToOracleFree recipe for Testcontainers by [`@​timtebeek`](https://github.com/timtebeek) in [openrewrite/rewrite-testing-frameworks#964](https://redirect.github.com/openrewrite/rewrite-testing-frameworks/pull/964)
>
> **Full Changelog**: <openrewrite/rewrite-testing-frameworks@v3.33.0...v3.34.0>
>
> 3.33.0
> ------
>
> What's Changed
> --------------
>
> * OpenRewrite recipe best practices by [`@​timtebeek`](https://github.com/timtebeek) in [openrewrite/rewrite-testing-frameworks#949](https://redirect.github.com/openrewrite/rewrite-testing-frameworks/pull/949)
> * Add RemoveDoNothingForDefaultMocks recipe by [`@​bmuschko`](https://github.com/bmuschko) in [openrewrite/rewrite-testing-frameworks#947](https://redirect.github.com/openrewrite/rewrite-testing-frameworks/pull/947)
> * Add PowerMockitoDoStubbingToMockito recipe by [`@​bmuschko`](https://github.com/bmuschko) in [openrewrite/rewrite-testing-frameworks#948](https://redirect.github.com/openrewrite/rewrite-testing-frameworks/pull/948)
> * Remove [`@​SuppressStaticInitializationFor`](https://github.com/SuppressStaticInitializationFor) during PowerMockito migration by [`@​bmuschko`](https://github.com/bmuschko) in [openrewrite/rewrite-testing-frameworks#946](https://redirect.github.com/openrewrite/rewrite-testing-frameworks/pull/946)

... (truncated)


Commits

* [`1302589`](openrewrite/rewrite-testing-frameworks@1302589) Make declarative recipes singletons
* [`92de89a`](openrewrite/rewrite-testing-frameworks@92de89a) Fix UpdateMockWebServerDispatcher classpath lookup ([#975](https://redirect.github.com/openrewrite/rewrite-testing-frameworks/issues/975))
* [`64260b8`](openrewrite/rewrite-testing-frameworks@64260b8) Extract documentation examples from tests
* [`e09430b`](openrewrite/rewrite-testing-frameworks@e09430b) Add [`@​MockitoSettings`](https://github.com/MockitoSettings)(strictness = Strictness.WARN) for Mockito migration ([#966](https://redirect.github.com/openrewrite/rewrite-testing-frameworks/issues/966))
* [`f041383`](openrewrite/rewrite-testing-frameworks@f041383) Fix MockWebServer Dispatcher return type and RecordedRequest renames ([#972](https://redirect.github.com/openrewrite/rewrite-testing-frameworks/issues/972))
* [`13f0a17`](openrewrite/rewrite-testing-frameworks@13f0a17) OpenRewrite recipe best practices
* [`83d1f44`](openrewrite/rewrite-testing-frameworks@83d1f44) Use KotlinTypeUtils.isKotlinUnit to match Kotlin void return types ([#971](https://redirect.github.com/openrewrite/rewrite-testing-frameworks/issues/971))
* [`675b57d`](openrewrite/rewrite-testing-frameworks@675b57d) Fix RemoveTryCatchFailBlocks failing when removing blocks within lambda expre...
* [`ea72478`](openrewrite/rewrite-testing-frameworks@ea72478) Fix ClassCastException in RemoveTimesZeroAndOne ([#969](https://redirect.github.com/openrewrite/rewrite-testing-frameworks/issues/969))
* [`58bcc12`](openrewrite/rewrite-testing-frameworks@58bcc12) Add MigrateToKafkaNative recipe for Testcontainers ([#568](https://redirect.github.com/openrewrite/rewrite-testing-frameworks/issues/568)) ([#967](https://redirect.github.com/openrewrite/rewrite-testing-frameworks/issues/967))
* Additional commits viewable in [compare view](openrewrite/rewrite-testing-frameworks@v3.30.0...v3.35.2)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

Archived in project

Development

Successfully merging this pull request may close these issues.

2 participants