如何用Mockito模拟Java中的泛型方法?

时间:2015-07-24 23:41:50

标签: java generics mockito

我们如何模仿IRouteHandlerRegistry?错误为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);
}

3 个答案:

答案 0 :(得分:3)

如果你这样写,那就没关系了:

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

答案 1 :(得分:2)

即使TestRoute是[{1}}的子类型,RouteDefinition 也不是 <{1}}的子类型。

Mockito的IHandleRoute<TestRoute>方法返回IHandleRoute<RouteDefinition>类型的对象。这是因为编译器从方法

中推断出类型参数when
OngoingStubbing<IHandleRoute<RouteDefinition>>

TRoute,因为传递给<TRoute extends RouteDefinition> IHandleRoute<TRoute> getHandlerFor(TRoute route); 的参数声明为RouteDefinition类型。

另一方面,getHandlerFor方法的参数类型为RouteDefinition,而它期望thenReturn,这是前面提到的IHandleRoute<TestRoute>的类型参数。因此编译错误。

要解决此问题,最简单的方法可能是将IHandleRoute<RouteDefinition>的声明类型更改为OngoingStubbing

route

答案 2 :(得分:1)

Mockito.when参数应该是一种方法而不是模拟。

正确的陈述是:  when(registry.getHandlerFor (route)).thenReturn(handler)

相关问题