我们如何模仿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);
}
答案 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)