Skip to content

Handle Kotlin sources in MockitoWhenOnStaticToMockStatic#1003

Merged
timtebeek merged 1 commit into
mainfrom
MBoegers/customer-request-2400
May 20, 2026
Merged

Handle Kotlin sources in MockitoWhenOnStaticToMockStatic#1003
timtebeek merged 1 commit into
mainfrom
MBoegers/customer-request-2400

Conversation

@MBoegers

@MBoegers MBoegers commented May 20, 2026

Copy link
Copy Markdown
Collaborator

Summary

  • Fix ClassCastException when MockitoWhenOnStaticToMockStatic runs on Kotlin sources containing Mockito.when(StaticClass.staticMethod(...)) (reported by Sunbit; blocks UpgradeSpringBoot_4_0).
  • Dispatch on compilation-unit type: existing Java logic is unchanged; a new Kotlin visitor recognizes mockStatic(X::class.java).use { ... } as the wrapping scope and rewrites the inner Mockito.when(X.static()) to call when on the lambda parameter (handles both implicit it and named parameter):
// before
mockStatic(X::class.java).use {
    `when`(X.static()).thenReturn(value)
}
// after
mockStatic(X::class.java).use {
    it.`when`<R> { X.static() }.thenReturn(value)
}
  • Also reuses an existing class-level MockedStatic<X> property (e.g. lateinit var set in @BeforeEach) when present.

Out of scope (deliberately): the fresh-wrap case for Kotlin (no enclosing .use and no class-level MockedStatic property). The recipe now degrades to a no-op for that case instead of crashing; the structural Kotlin equivalent of the Java tryWithMockedStatic path will be a follow-up.

Resolves moderneinc/customer-requests#2400.

Test plan

  • ./gradlew test --tests "*MockitoWhenOnStaticToMockStaticTest*" passes, including the five new Kotlin tests:
    • shouldRewriteKotlinMockitoWhenInsideMockStaticUseWithImplicitIt (Sunbit reproducer)
    • shouldRewriteKotlinMockitoWhenInsideMockStaticUseWithNamedParam
    • shouldRewriteKotlinMockitoWhenWithMultipleStatementsInUseBlock
    • shouldRewriteKotlinMockitoWhenWithClassLevelMockedStaticProperty
    • shouldNotRewriteKotlinMockitoWhenWhenStaticClassDoesNotMatchUseReceiver
  • ./gradlew test (full suite) green.

@github-project-automation github-project-automation Bot moved this from In Progress to Ready to Review in OpenRewrite May 20, 2026
@timtebeek timtebeek merged commit 32c7752 into main May 20, 2026
1 check passed
@timtebeek timtebeek deleted the MBoegers/customer-request-2400 branch May 20, 2026 17:43
@github-project-automation github-project-automation Bot moved this from Ready to Review to Done in OpenRewrite May 20, 2026
mergify Bot added a commit to robfrank/linklift that referenced this pull request Jun 4, 2026
…rom 3.35.2 to 3.37.0 [skip ci]

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

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

> 3.37.0
> ------
>
> What's Changed
> --------------
>
> * Reuse `MockedStatic` for consecutive stubbings of the same class by [`@​timtebeek`](https://github.com/timtebeek) in [openrewrite/rewrite-testing-frameworks#1005](https://redirect.github.com/openrewrite/rewrite-testing-frameworks/pull/1005)
> * Add RemoveJupiterMigrationSupport recipe by [`@​sullis`](https://github.com/sullis) in [openrewrite/rewrite-testing-frameworks#1006](https://redirect.github.com/openrewrite/rewrite-testing-frameworks/pull/1006)
> * Regenerate recipes.csv by [`@​timtebeek`](https://github.com/timtebeek) in [openrewrite/rewrite-testing-frameworks#1007](https://redirect.github.com/openrewrite/rewrite-testing-frameworks/pull/1007)
> * fix: retain doNothing() stubs inside lambda bodies to prevent uncompilable code by [`@​darrencilia`](https://github.com/darrencilia) in [openrewrite/rewrite-testing-frameworks#1009](https://redirect.github.com/openrewrite/rewrite-testing-frameworks/pull/1009)
> * Migrate deprecated AssertionsForClassTypes/InterfaceTypes to Assertions by [`@​timtebeek`](https://github.com/timtebeek) in [openrewrite/rewrite-testing-frameworks#1010](https://redirect.github.com/openrewrite/rewrite-testing-frameworks/pull/1010)
> * Add direct mockwebserver3 dep when only inherited from parent pom by [`@​steve-aom-elliott`](https://github.com/steve-aom-elliott) in [openrewrite/rewrite-testing-frameworks#1011](https://redirect.github.com/openrewrite/rewrite-testing-frameworks/pull/1011)
> * Match MockWebServer.shutdown() against pre-rename type by [`@​steve-aom-elliott`](https://github.com/steve-aom-elliott) in [openrewrite/rewrite-testing-frameworks#1012](https://redirect.github.com/openrewrite/rewrite-testing-frameworks/pull/1012)
>
> New Contributors
> ----------------
>
> * [`@​darrencilia`](https://github.com/darrencilia) made their first contribution in [openrewrite/rewrite-testing-frameworks#1009](https://redirect.github.com/openrewrite/rewrite-testing-frameworks/pull/1009)
>
> **Full Changelog**: <openrewrite/rewrite-testing-frameworks@v3.36.0...v3.37.0>
>
> 3.36.0
> ------
>
> What's Changed
> --------------
>
> * Skip wrapper-primitive in `UseAssertSame`; rewrite via `AssertTrueComparisonToAssertEquals` by [`@​motlin`](https://github.com/motlin) in [openrewrite/rewrite-testing-frameworks#995](https://redirect.github.com/openrewrite/rewrite-testing-frameworks/pull/995)
> * Add unit test for JUnit6BestPractices by [`@​sullis`](https://github.com/sullis) in [openrewrite/rewrite-testing-frameworks#994](https://redirect.github.com/openrewrite/rewrite-testing-frameworks/pull/994)
> * Cleanup junit vintage engine by [`@​sullis`](https://github.com/sullis) in [openrewrite/rewrite-testing-frameworks#993](https://redirect.github.com/openrewrite/rewrite-testing-frameworks/pull/993)
> * OpenRewrite recipe best practices by [`@​timtebeek`](https://github.com/timtebeek) in [openrewrite/rewrite-testing-frameworks#997](https://redirect.github.com/openrewrite/rewrite-testing-frameworks/pull/997)
> * Fix `JUnit4to5Migration` for classes that extend `org.junit.Assert` by [`@​motlin`](https://github.com/motlin) in [openrewrite/rewrite-testing-frameworks#996](https://redirect.github.com/openrewrite/rewrite-testing-frameworks/pull/996)
> * Preserve newlines when converting `@CsvSource(textBlock = ...)` to `@ValueSource` by [`@​timtebeek`](https://github.com/timtebeek) in [openrewrite/rewrite-testing-frameworks#998](https://redirect.github.com/openrewrite/rewrite-testing-frameworks/pull/998)
> * Fix `EnclosedToNested` failing with "Expected to find enclosing JavaSourceFile" by [`@​timtebeek`](https://github.com/timtebeek) in [openrewrite/rewrite-testing-frameworks#1001](https://redirect.github.com/openrewrite/rewrite-testing-frameworks/pull/1001)
> * Fix `assertEquals` delta misinterpreted as message in AssertJ conversion by [`@​timtebeek`](https://github.com/timtebeek) in [openrewrite/rewrite-testing-frameworks#1000](https://redirect.github.com/openrewrite/rewrite-testing-frameworks/pull/1000)
> * Add JUnit 6.1 migration recipes by [`@​timtebeek`](https://github.com/timtebeek) in [openrewrite/rewrite-testing-frameworks#1002](https://redirect.github.com/openrewrite/rewrite-testing-frameworks/pull/1002)
> * Handle Kotlin sources in `MockitoWhenOnStaticToMockStatic` by [`@​MBoegers`](https://github.com/MBoegers) in [openrewrite/rewrite-testing-frameworks#1003](https://redirect.github.com/openrewrite/rewrite-testing-frameworks/pull/1003)
>
> **Full Changelog**: <openrewrite/rewrite-testing-frameworks@v3.35.3...v3.36.0>
>
> v3.35.3
> -------
>
> What's Changed
> --------------
>
> * OpenRewrite [v8.81.6](https://github.com/openrewrite/rewrite/releases/tag/v8.81.6)
> * Cleanup Mockito AutoCloseable fields by [`@​sullis`](https://github.com/sullis) in [openrewrite/rewrite-testing-frameworks#977](https://redirect.github.com/openrewrite/rewrite-testing-frameworks/pull/977)
> * Preserve mockStatic when returned from helper methods by [`@​timtebeek`](https://github.com/timtebeek) in [openrewrite/rewrite-testing-frameworks#979](https://redirect.github.com/openrewrite/rewrite-testing-frameworks/pull/979)
> * Upgrade junit-bom to 6.x in JUnit 5 to 6 migration by [`@​timtebeek`](https://github.com/timtebeek) in [openrewrite/rewrite-testing-frameworks#978](https://redirect.github.com/openrewrite/rewrite-testing-frameworks/pull/978)
> * Tighten PowerMockitoMockStaticToMockito precondition to actual PowerMockito usage by [`@​timtebeek`](https://github.com/timtebeek) in [openrewrite/rewrite-testing-frameworks#981](https://redirect.github.com/openrewrite/rewrite-testing-frameworks/pull/981)
> * Fix AssertTrueInstanceofToAssertInstanceOf static import by [`@​timtebeek`](https://github.com/timtebeek) in [openrewrite/rewrite-testing-frameworks#984](https://redirect.github.com/openrewrite/rewrite-testing-frameworks/pull/984)
> * Fix `ClassCastException` for `@PrepareForTest(fullyQualifiedNames = "...")` by [`@​timtebeek`](https://github.com/timtebeek) in [openrewrite/rewrite-testing-frameworks#983](https://redirect.github.com/openrewrite/rewrite-testing-frameworks/pull/983)
> * Preserve `doNothing()` stubbings using `ArgumentCaptor.capture()` by [`@​timtebeek`](https://github.com/timtebeek) in [openrewrite/rewrite-testing-frameworks#988](https://redirect.github.com/openrewrite/rewrite-testing-frameworks/pull/988)
> * Document strictness implication of `RemoveInitMocksIfRunnersSpecified` by [`@​timtebeek`](https://github.com/timtebeek) in [openrewrite/rewrite-testing-frameworks#990](https://redirect.github.com/openrewrite/rewrite-testing-frameworks/pull/990)
> * Support `textBlock` attribute in `CsvSourceToValueSource` by [`@​timtebeek`](https://github.com/timtebeek) in [openrewrite/rewrite-testing-frameworks#989](https://redirect.github.com/openrewrite/rewrite-testing-frameworks/pull/989)
> * Skip primitive comparisons in `UseAssertSame` by [`@​timtebeek`](https://github.com/timtebeek) in [openrewrite/rewrite-testing-frameworks#992](https://redirect.github.com/openrewrite/rewrite-testing-frameworks/pull/992)
>
> **Full Changelog**: <openrewrite/rewrite-testing-frameworks@v3.35.2...v3.35.3>


Commits

* [`5b719c2`](openrewrite/rewrite-testing-frameworks@5b719c2) Extract documentation examples from tests
* [`1ca6223`](openrewrite/rewrite-testing-frameworks@1ca6223) Match MockWebServer.shutdown() against pre-rename type ([#1012](https://redirect.github.com/openrewrite/rewrite-testing-frameworks/issues/1012))
* [`9479988`](openrewrite/rewrite-testing-frameworks@9479988) Add direct mockwebserver3 dep when only old mockwebserver dep inherited from ...
* [`4d31fbb`](openrewrite/rewrite-testing-frameworks@4d31fbb) Add recipe to migrate AssertionsForClassTypes/InterfaceTypes to Assertions (#...
* [`7cbff2a`](openrewrite/rewrite-testing-frameworks@7cbff2a) OpenRewrite recipe best practices
* [`86f2308`](openrewrite/rewrite-testing-frameworks@86f2308) fix: retain doNothing() stubs inside lambda bodies to prevent uncompilable co...
* [`45d2528`](openrewrite/rewrite-testing-frameworks@45d2528) Update Gradle wrapper 9.5.1
* [`a632e17`](openrewrite/rewrite-testing-frameworks@a632e17) Regenerate recipes.csv ([#1007](https://redirect.github.com/openrewrite/rewrite-testing-frameworks/issues/1007))
* [`0b192ca`](openrewrite/rewrite-testing-frameworks@0b192ca) Add RemoveJupiterMigrationSupport recipe ([#1006](https://redirect.github.com/openrewrite/rewrite-testing-frameworks/issues/1006))
* [`f3f61a6`](openrewrite/rewrite-testing-frameworks@f3f61a6) Reuse `MockedStatic` for consecutive stubbings of the same class ([#1005](https://redirect.github.com/openrewrite/rewrite-testing-frameworks/issues/1005))
* Additional commits viewable in [compare view](openrewrite/rewrite-testing-frameworks@v3.35.2...v3.37.0)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Archived in project

Development

Successfully merging this pull request may close these issues.

2 participants