Skip to content

Conversation

@giulong
Copy link
Contributor

@giulong giulong commented Sep 18, 2025

MockedStatic and MockedConstruction threw a MockitoException when the provided type was itself parameterized, suggesting to use a raw type instead. For instance, MockedConstruction<MyGenericType<String>> was not allowed.

This commit allows to mock generic types without throwing an exception and without forcing users to deal with raw use of parameterized class warnings.

Fixes #2401

Checklist

  • Read the contributing guide
  • PR should be motivated, i.e. what does it fix, why, and if relevant how
  • If possible / relevant include an example in the description, that could help all readers
    including project members to get a better picture of the change
  • Avoid other runtime dependencies
  • Meaningful commit history ; intention is important please rebase your commit history so that each
    commit is meaningful and help the people that will explore a change in 2 years
  • The pull request follows coding style (run ./gradlew spotlessApply for auto-formatting)
  • Mention Fixes #<issue number> in the description if relevant
  • At least one commit should end with Fixes #<issue number> if relevant

if (arguments[0] instanceof Class<?>) {
return (Class<?>) arguments[0];
}
if (arguments[0] instanceof ParameterizedType) {
Copy link
Contributor Author

Choose a reason for hiding this comment

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

I tried to respect the current flow by just adding the new condition, but since both MockedStatic and MockedConstruction take only one generic parameter, this block can be simplified to something like:

if (type instanceof ParameterizedType) {
    ParameterizedType parameterizedType = (ParameterizedType) type;
    Type[] arguments = parameterizedType.getActualTypeArguments();
    return (Class<?>)
            (arguments[0] instanceof Class<?>
                    ? arguments[0]
                    : ((ParameterizedType) arguments[0]).getRawType());
}

Should I apply this change?

Copy link
Contributor

Choose a reason for hiding this comment

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

Let's simplify this, but add a check that arguments.length is only 1. E.g. if (arguments.length != 1) throw MockitoException`

@codecov-commenter
Copy link

codecov-commenter commented Sep 19, 2025

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 86.43%. Comparing base (3cfbd42) to head (cad84e7).
⚠️ Report is 1 commits behind head on main.

Additional details and impacted files
@@             Coverage Diff              @@
##               main    #3729      +/-   ##
============================================
+ Coverage     86.40%   86.43%   +0.02%     
- Complexity     2969     2970       +1     
============================================
  Files           341      341              
  Lines          9013     9016       +3     
  Branches       1111     1111              
============================================
+ Hits           7788     7793       +5     
+ Misses          943      942       -1     
+ Partials        282      281       -1     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

Copy link
Contributor

@TimvdLippe TimvdLippe left a comment

Choose a reason for hiding this comment

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

1 small nit. The rest LGTM!

if (arguments[0] instanceof Class<?>) {
return (Class<?>) arguments[0];
}
if (arguments[0] instanceof ParameterizedType) {
Copy link
Contributor

Choose a reason for hiding this comment

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

Let's simplify this, but add a check that arguments.length is only 1. E.g. if (arguments.length != 1) throw MockitoException`

…o#2401)

MockedStatic and MockedConstruction threw a MockitoException when the
provided type was itself parameterized, suggesting to use a raw type instead.
For instance, MockedConstruction<MyGenericType<String>> was not allowed.

This commit allows to mock generic types without throwing an exception and
without forcing users to deal with 'raw use of parameterized class' warnings.

Fixes mockito#2401
}
if (arguments.length != 1) {
throw new IllegalArgumentException(
"Incorrect number of type arguments for "
Copy link
Contributor Author

Choose a reason for hiding this comment

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

Throwing an IllegalArgumentException as in InstrumentationMemberAccessor and other places.

@giulong giulong requested a review from TimvdLippe September 19, 2025 18:12
Copy link
Contributor

@TimvdLippe TimvdLippe left a comment

Choose a reason for hiding this comment

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

Thanks a lot!

@TimvdLippe TimvdLippe merged commit 3a1a19e into mockito:main Sep 20, 2025
19 checks passed
svc-squareup-copybara pushed a commit to cashapp/misk that referenced this pull request Sep 21, 2025
| Package | Type | Package file | Manager | Update | Change |
|---|---|---|---|---|---|
| [org.mockito:mockito-core](https://github.com/mockito/mockito) |
dependencies | misk/gradle/libs.versions.toml | gradle | minor |
`5.19.0` -> `5.20.0` |
|
[io.modelcontextprotocol:kotlin-sdk-server](https://github.com/modelcontextprotocol/kotlin-sdk)
| dependencies | misk/gradle/libs.versions.toml | gradle | patch |
`0.7.1` -> `0.7.2` |
|
[io.modelcontextprotocol:kotlin-sdk-core](https://github.com/modelcontextprotocol/kotlin-sdk)
| dependencies | misk/gradle/libs.versions.toml | gradle | patch |
`0.7.1` -> `0.7.2` |
|
[io.modelcontextprotocol:kotlin-sdk-client](https://github.com/modelcontextprotocol/kotlin-sdk)
| dependencies | misk/gradle/libs.versions.toml | gradle | patch |
`0.7.0` -> `0.7.2` |
|
[com.google.errorprone:error_prone_annotations](https://errorprone.info)
([source](https://github.com/google/error-prone)) | dependencies |
misk/gradle/libs.versions.toml | gradle | minor | `2.41.0` -> `2.42.0` |
| [software.amazon.awssdk:sdk-core](https://aws.amazon.com/sdkforjava) |
dependencies | misk/gradle/libs.versions.toml | gradle | minor |
`2.33.13` -> `2.34.0` |
| [software.amazon.awssdk:sqs](https://aws.amazon.com/sdkforjava) |
dependencies | misk/gradle/libs.versions.toml | gradle | minor |
`2.33.13` -> `2.34.0` |
| [software.amazon.awssdk:s3](https://aws.amazon.com/sdkforjava) |
dependencies | misk/gradle/libs.versions.toml | gradle | minor |
`2.33.13` -> `2.34.0` |
| [software.amazon.awssdk:regions](https://aws.amazon.com/sdkforjava) |
dependencies | misk/gradle/libs.versions.toml | gradle | minor |
`2.33.13` -> `2.34.0` |
|
[software.amazon.awssdk:dynamodb-enhanced](https://aws.amazon.com/sdkforjava)
| dependencies | misk/gradle/libs.versions.toml | gradle | minor |
`2.33.13` -> `2.34.0` |
| [software.amazon.awssdk:dynamodb](https://aws.amazon.com/sdkforjava) |
dependencies | misk/gradle/libs.versions.toml | gradle | minor |
`2.33.13` -> `2.34.0` |
| [software.amazon.awssdk:aws-core](https://aws.amazon.com/sdkforjava) |
dependencies | misk/gradle/libs.versions.toml | gradle | minor |
`2.33.13` -> `2.34.0` |
| [software.amazon.awssdk:bom](https://aws.amazon.com/sdkforjava) |
dependencies | misk/gradle/libs.versions.toml | gradle | minor |
`2.33.13` -> `2.34.0` |
| [software.amazon.awssdk:auth](https://aws.amazon.com/sdkforjava) |
dependencies | misk/gradle/libs.versions.toml | gradle | minor |
`2.33.13` -> `2.34.0` |

---

### Release Notes

<details>
<summary>mockito/mockito (org.mockito:mockito-core)</summary>

### [`v5.20.0`](https://github.com/mockito/mockito/releases/tag/v5.20.0)

<sup><sup>*Changelog generated by [Shipkit Changelog Gradle
Plugin](https://github.com/shipkit/shipkit-changelog)*</sup></sup>

##### 5.20.0

- 2025-09-20 - [11
commit(s)](mockito/mockito@v5.19.0...v5.20.0)
by Adrian-Kim, Giulio Longfils, Rafael Winterhalter, dependabot\[bot]
- Bump org.assertj:assertj-core from 3.27.4 to 3.27.5
[(#&#8203;3730)](mockito/mockito#3730)
- Introducing the Ability to Mock Construction of Generic Types
([#&#8203;2401](mockito/mockito#2401))
[(#&#8203;3729)](mockito/mockito#3729)
- Bump com.gradle.develocity from 4.1.1 to 4.2
[(#&#8203;3726)](mockito/mockito#3726)
- Bump graalvm/setup-graalvm from 1.3.6 to 1.3.7
[(#&#8203;3725)](mockito/mockito#3725)
- Bump org.eclipse.platform:org.eclipse.osgi from 3.23.100 to 3.23.200
[(#&#8203;3720)](mockito/mockito#3720)
- Bump graalvm/setup-graalvm from 1.3.5 to 1.3.6
[(#&#8203;3719)](mockito/mockito#3719)
- Bump actions/setup-java from 4 to 5
[(#&#8203;3715)](mockito/mockito#3715)
- Bump com.gradle.develocity from 4.1 to 4.1.1
[(#&#8203;3713)](mockito/mockito#3713)
- Bump bytebuddy from 1.17.6 to 1.17.7
[(#&#8203;3712)](mockito/mockito#3712)
- test: Use Assume.assumeThat for SequencedCollection tests
[(#&#8203;3711)](mockito/mockito#3711)
- Fix [#&#8203;3709](mockito/mockito#3709)
[(#&#8203;3710)](mockito/mockito#3710)
- feat: Add support for JDK21 Sequenced Collections.
[(#&#8203;3708)](mockito/mockito#3708)
- Introducing the Ability to Mock Construction of Generic Types
[(#&#8203;2401)](mockito/mockito#2401)

</details>

<details>
<summary>modelcontextprotocol/kotlin-sdk
(io.modelcontextprotocol:kotlin-sdk-server)</summary>

###
[`v0.7.2`](https://github.com/modelcontextprotocol/kotlin-sdk/releases/tag/0.7.2)

[Compare
Source](modelcontextprotocol/kotlin-sdk@0.7.1...0.7.2)

##### What's Changed

- migration from `jreleaser` to `mavenPublish` plugin by
[@&#8203;devcrocod](https://github.com/devcrocod) in
[#&#8203;277](modelcontextprotocol/kotlin-sdk#277)
- Generate test report by [@&#8203;kpavlov](https://github.com/kpavlov)
in
[#&#8203;271](modelcontextprotocol/kotlin-sdk#271)
- Move `generateLibVersion` task to `kotlin-sdk-core` by
[@&#8203;devcrocod](https://github.com/devcrocod) in
[#&#8203;274](modelcontextprotocol/kotlin-sdk#274)
-
[#&#8203;196](modelcontextprotocol/kotlin-sdk#196)
Update build configuration and workflows for enhanced local publ… by
[@&#8203;kpavlov](https://github.com/kpavlov) in
[#&#8203;275](modelcontextprotocol/kotlin-sdk#275)
- Add Stdio coverage for integration tests by
[@&#8203;skarpovdev](https://github.com/skarpovdev) in
[#&#8203;276](modelcontextprotocol/kotlin-sdk#276)
- Bump io.kotest:kotest-assertions-json from 5.9.1 to 6.0.3 by
[@&#8203;dependabot](https://github.com/dependabot)\[bot] in
[#&#8203;247](modelcontextprotocol/kotlin-sdk#247)
- migration from `jreleaser` to `mavenPublish` plugin by
[@&#8203;devcrocod](https://github.com/devcrocod) in
[#&#8203;277](modelcontextprotocol/kotlin-sdk#277)

**Full Changelog**:
<modelcontextprotocol/kotlin-sdk@0.7.1...0.7.2>

</details>

<details>
<summary>google/error-prone
(com.google.errorprone:error_prone_annotations)</summary>

###
[`v2.42.0`](https://github.com/google/error-prone/releases/tag/v2.42.0):
Error Prone 2.42.0

New checks:

-
[`ExplicitArrayForVarargs`](https://errorprone.info/bugpattern/ExplicitArrayForVarargs):
discourage unnecessary explicit construction of an array to provide
varargs.
-
[`FloggerPerWithoutRateLimit`](https://errorprone.info/bugpattern/FloggerPerWithoutRateLimit):
discourage Flogger's `perUnique` without rate limiting
- [`StringJoin`](https://errorprone.info/bugpattern/StringJoin): Ban
`String.join(CharSequence)` and `String.join(CharSequence,
CharSequence)`
-
[`ThreadBuilderNameWithPlaceholder`](https://errorprone.info/bugpattern/ThreadBuilderNameWithPlaceholder):
Do not allow placeholders in `Thread.Builder.name(String)` or
`name(String, int)`.

Changes:

- The return type of `ASTHelpers.asFlagSet` has changed. The previous
type was `EnumSet<Flags.Flag>`, where `Flags.Flag` is an enum in the
javac class `Flags`. A recent JDK change has replaced that enum with a
new top-level enum called `FlagsEnum`. It is not possible to change
`ASTHelpers.asFlagSet` in a way that would be type-safe and compatible
with the enums from JDKs both before and after the change. Instead, the
method now returns `ImmutableSet<String>`, where the strings come from
the `toString()` of the enum constants. That means they are `"native"`,
`"abstract"`, etc.
- Flag `IO.print[ln]()` in
[`SystemOut`](https://errorprone.info/bugpattern/SystemOut).

Full changelog:
<google/error-prone@v2.41.0...v2.42.0>

</details>

---

### Configuration

📅 **Schedule**: Branch creation - "after 6pm every weekday,before 2am
every weekday" in timezone Australia/Melbourne, Automerge - At any time
(no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Never, or you tick the rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get
[config help](https://github.com/renovatebot/renovate/discussions) if
that's undesired.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Renovate
Bot](https://github.com/renovatebot/renovate).

GitOrigin-RevId: 8ecb809cff408a555b4ee0773a9fb8cdca50b95c
dongjoon-hyun added a commit to apache/spark-kubernetes-operator that referenced this pull request Oct 1, 2025
### What changes were proposed in this pull request?

This PR aims to upgrade `mockito` to 5.20.0 for Apache Spark K8s Operator `v0.6`.

### Why are the changes needed?

To bring the latest features and bug fixes.
- https://github.com/mockito/mockito/releases/tag/v5.20.0
  - mockito/mockito#3729
  - mockito/mockito#3709
- https://github.com/mockito/mockito/releases/tag/v5.19.0
  - mockito/mockito#3708
  - mockito/mockito#3659

### Does this PR introduce _any_ user-facing change?

No behavior change.

### How was this patch tested?

Pass the CIs.

### Was this patch authored or co-authored using generative AI tooling?

No.

Closes #358 from dongjoon-hyun/SPARK-53770.

Authored-by: Dongjoon Hyun <dongjoon@apache.org>
Signed-off-by: Dongjoon Hyun <dongjoon@apache.org>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Introducing the Ability to Mock Construction of Generic Types

3 participants