Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

RETURNS_SELF breaks methods with generic return type #2686

Closed
mlichtblau opened this issue Jun 14, 2022 · 0 comments · Fixed by #2687
Closed

RETURNS_SELF breaks methods with generic return type #2686

mlichtblau opened this issue Jun 14, 2022 · 0 comments · Fixed by #2687

Comments

@mlichtblau
Copy link
Contributor

mlichtblau commented Jun 14, 2022

I'm trying to use RETURNS_SELF to mock a builder with a generic method:

private static class HttpBuilder {
  private String uri;
  
  public HttpBuilder withUri(String uri) {
    this.uri = uri;
    return this
  }

  ...

  public <T> T request(T result) {
    return result; // Do typed request
  }
}

It is easy enough to mock using:

val builder = mock(HttpBuilder.class, RETURNS_SELF);

However this breaks:

given(builder.request(anyString())).willAnswer(i"Mocked result");

The problem is, that anyString() infers builder.request to have a String return type, which infers given to have a String methodCall parameter.
However, at runtime a ClassCastException is thrown as builder.request(anyString()) returns a HttpBuilder$MockitoMock which cannot be cast to the the String expected by given.
(I think) this is caused by RETURNS_SELF here in the TriesToReturnSelf class. The generic method has the return type Object which is obviously assignable from mockType. This causes mockito to always undesirably return this with methods with generic return types when using RETURNS_SELF.

Is it possible for mockito to check whether the return type of the method is generic? In that case I would suggest a fix to never return this for methods with generic return types.
If you think this would be a good solution, I am happy to contribute a fix.

edit: What do you think of checking whether return type is of type Object.class, which suggests that mockito should probable return the empty value instead of this

edit 2: Added #2687 to demonstrate the issue with a test and solution proposal. Happy to update with any comments

@mlichtblau mlichtblau changed the title RETURNS_SELF makes partial implementation of methods with generic return type impossible RETURNS_SELF breaks methods with generic return type Jun 14, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
1 participant