2015-07-24 2 views
4

Как мы можем издеваться над IRouteHandlerRegistry? Ошибка Cannot resolve method thenReturn(IHandleRoute<TestRoute>)Как обмануть общий метод в Java с помощью Mockito?

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); 
} 
+0

Что такое 'SutFactory'? –

+0

Можете ли вы объяснить, что об этом не работает? Какая ошибка/предупреждение вы получаете? –

ответ

3

Даже если TestRoute является подтипом RouteDefinition, IHandleRoute<TestRoute> является не подтипом IHandleRoute<RouteDefinition>.

Метод when от Mockito возвращает объект типа OngoingStubbing<IHandleRoute<RouteDefinition>>. Это связано с компилятором выводя параметр типа TRoute от метода

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

RouteDefinition быть, так как аргумент, переданный getHandlerFor объявлен типа RouteDefinition.

С другой стороны, метод thenReturn приведен аргумент типа IHandleRoute<TestRoute> тогда как ожидает IHandleRoute<RouteDefinition>, то есть тип аргумент OngoingStubbing упоминалось ранее. Следовательно, ошибка компилятора.

Чтобы решить эту проблему, самый простой способ, вероятно, изменить тип декларации о route быть TestRoute:

TestRoute route = new TestRoute(); 

IRouteHandlerRegistry registry = mock(IRouteHandlerRegistry.class); 
IHandleRoute<TestRoute> handler = mock(IHandleRoute.class); 

when(registry.getHandlerFor(route)).thenReturn(handler); 
+1

спасибо, это помогает мне с моим пониманием java generics, а также –

1

Если вы пишете, как это будет хорошо:

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

Mockito.when аргумент должен быть метод не фиктивный.

Правильное утверждение: when(registry.getHandlerFor (route)).thenReturn(handler)

+0

Вы правы, жаль, что я сделал редактирование с помощью своего телефона и не отредактировал его правильно ... это не было моей проблемой. –

Смежные вопросы