Skip to content

Add RemoveDoNothingForDefaultMocks recipe#947

Merged
timtebeek merged 2 commits intomainfrom
bmuschko/rm-unnecessary-stub
Mar 30, 2026
Merged

Add RemoveDoNothingForDefaultMocks recipe#947
timtebeek merged 2 commits intomainfrom
bmuschko/rm-unnecessary-stub

Conversation

@bmuschko
Copy link
Copy Markdown
Contributor

@bmuschko bmuschko commented Mar 29, 2026

Summary

After running Mockito1to3Migration, tests fail at runtime with:

org.mockito.exceptions.misusing.UnnecessaryStubbingException: 
Unnecessary stubbings detected in test class: MyTest
Clean & maintainable test code requires zero unnecessary code.
Following stubbings are unnecessary (click to navigate to relevant line of code):
  1. -> at MyTest.test(MyTest.java:18)
Please remove unnecessary stubbings or use 'lenient' strictness. More info: javadoc for UnnecessaryStubbingException class.

	at org.mockito.junit.MockitoJUnitRunner$StrictRunner.run(MockitoJUnitRunner.java:78)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:115)

This happens because Mockito 3+ enables strict stubbing by default (via MockitoJUnitRunner or MockitoExtension), and doNothing().when(mock).voidMethod() on @Mock fields is redundant — mocks already do nothing for void methods.

Use cases covered

Per the Mockito Javadoc and Stubber Javadoc, doNothing() has several valid and invalid uses:

Pattern Action Reason
doNothing().when(mock).voidMethod() Remove Redundant on @Mock — default behavior
doNothing().when(mock).voidMethod(argThat(...)) Remove Same, with argument matchers
Multiple standalone doNothing() statements Remove all Each is independently redundant
doNothing().when(spy).voidMethod() Preserve Prevents real method execution on @Spy (Mockito Javadoc §13)
doThrow(ex).doNothing().when(mock).method() Preserve Consecutive call stubbing: throw first, then do nothing (Mockito Chaining)
doNothing().doThrow(ex).when(mock).method() Preserve Consecutive call stubbing: do nothing first, then throw (Stubber Javadoc)

References

Remove unnecessary `doNothing()` stubbings on `@Mock` fields that cause
UnnecessaryStubbingException after migrating to Mockito 3+.
@github-project-automation github-project-automation Bot moved this to In Progress in OpenRewrite Mar 29, 2026
@bmuschko bmuschko added the enhancement New feature or request label Mar 29, 2026
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.

Nice! Less to maintain is always better, especially with Mocks that tie you closely to their implementation.

@github-project-automation github-project-automation Bot moved this from In Progress to Ready to Review in OpenRewrite Mar 30, 2026
`false` is the default for `matchOverrides`, so the single-arg
constructor is sufficient and consistent with the rest of the codebase.
@timtebeek timtebeek merged commit d4b1c86 into main Mar 30, 2026
@timtebeek timtebeek deleted the bmuschko/rm-unnecessary-stub branch March 30, 2026 09:58
@github-project-automation github-project-automation Bot moved this from Ready to Review to Done in OpenRewrite Mar 30, 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