10

How can we mock the IRouteHandlerRegistry? The error is Cannot resolve method thenReturn(IHandleRoute<TestRoute>)

public interface RouteDefinition { } public class TestRoute implements RouteDefinition { } public interface IHandleRoute<TRoute extends RouteDefinition> { Route getHandlerFor(TRoute route); } public interface IRouteHandlerRegistry { <TRoute extends RouteDefinition> IHandleRoute<TRoute> getHandlerFor(TRoute route); } @Test @SuppressWarnings("unchecked") public void test() { // in my test RouteDefinition route = new TestRoute(); // TestRoute implements RouteDefinition IRouteHandlerRegistry registry = mock(IRouteHandlerRegistry.class); IHandleRoute<TestRoute> handler = mock(IHandleRoute.class); // Error: Cannot resolve method 'thenReturn(IHandleRoute<TestRoute>)' when(registry.getHandlerFor(route)).thenReturn(handler); } 
2
  • What is SutFactory? Commented Jul 24, 2015 at 23:47
  • Can you explain what about this doesn't work? What is the error/warning that you get? Commented Jul 24, 2015 at 23:48

3 Answers 3

6
+50

Even though TestRoute is a subtype of RouteDefinition, a IHandleRoute<TestRoute> is not a subtype of IHandleRoute<RouteDefinition>.

The when method from Mockito returns an object of type OngoingStubbing<IHandleRoute<RouteDefinition>>. This is due to the compiler inferring the type parameter TRoute from the method

<TRoute extends RouteDefinition> IHandleRoute<TRoute> getHandlerFor(TRoute route); 

to be RouteDefinition since the argument passed to getHandlerFor is declared of type RouteDefinition.

On the other hand, the thenReturn method is given an argument of type IHandleRoute<TestRoute> whereas it expects an IHandleRoute<RouteDefinition>, that is the type argument of the OngoingStubbing mentioned earlier. Hence the compiler error.

To solve this, the simplest way is probably to change the declaration type of route to be TestRoute:

TestRoute route = new TestRoute(); IRouteHandlerRegistry registry = mock(IRouteHandlerRegistry.class); IHandleRoute<TestRoute> handler = mock(IHandleRoute.class); when(registry.getHandlerFor(route)).thenReturn(handler); 
Sign up to request clarification or add additional context in comments.

1 Comment

thank you, this helps me with my understanding of java generics as well
5

If you write like this it will be ok:

Mockito.doReturn(handler).when(registry).getHandlerFor(Mockito.any(route.class)) 

Comments

1

Mockito.when argument should be a method not a mock.

The correct statement is: when(registry.getHandlerFor (route)).thenReturn(handler)

1 Comment

You are correct, sorry I made an edit using my phone and didn't edit it correctly... this wasn't my issue though.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.