Mockito Java 8 个编译错误
Mockito Java 8 compilation errors
我刚转到 Java 8,我遇到了一些我不太明白如何克服的编译错误。
以下代码无法编译:
Mockito.when(
jdbcTemplate.query(Mockito.eq(expectedQuery1),
Mockito.any(ResultSetExtractor.class))).thenReturn(mockReturn1);
有错误:
The method query(String, ResultSetExtractor<T>) in the type JdbcTemplate is not
applicable for the arguments (String, ResultSetExtractor)
我尝试了 Java 1.8 with Mockito 1.9.5 gives compile errors 的另一种方法:
Mockito.when(jdbcTemplate.query(Mockito.eq(expectedQuery1), Mockito.any()))
.thenReturn(mockReturn1);
现在我收到以下错误:
The method when(T) in the type Mockito is not applicable for the arguments (void)
这究竟应该如何工作以及为什么它首先不起作用
正在发生的事情是您正在传递类型为 Class<ResultSetExtractor>
的 mockito ResultSetExtractor.class
,但这是不正确的,因为它期望 Class<ResultSetExtractor<T>>
.
为了克服这个问题,定义一个方法如下:
@SuppressWarnings( "rawtypes" )
public static <T> Class<T> uncheckedClassCast( Class clazz )
{
if( clazz == null )
return null;
@SuppressWarnings( "unchecked" )
Class<T> result = (Class<T>)clazz;
return result;
}
并按如下方式使用:
Class<ResultSetExtractor<T>> resultSetExtractorClass =
uncheckedClassCast( ResultSetExtractor.class );
然后,在调用 mockito(或其他任何东西)时使用 resultSetExtractorClass
而不是 ResultSetExtractor.class
。
添加类型见证以帮助 Eclipse 编译器解决所有问题:
Mockito.when(jdbcTemplate.query(Mockito.eq(expectedQuery1),
Mockito.<ResultSetExtractor<TYPE>> any())).thenReturn(mockReturn1);
确保将 TYPE
替换为 mockReturn1
的类型。例如
String mockReturn1 = "result";
Mockito.when(jdbcTemplate.query(Mockito.eq(expectedQuery1),
Mockito.<ResultSetExtractor<String>> any())).thenReturn(mockReturn1);
我希望 Oracle Java 8 编译器能够自行解决这个问题,因为它改进了类型推断功能。
我刚转到 Java 8,我遇到了一些我不太明白如何克服的编译错误。
以下代码无法编译:
Mockito.when(
jdbcTemplate.query(Mockito.eq(expectedQuery1),
Mockito.any(ResultSetExtractor.class))).thenReturn(mockReturn1);
有错误:
The method query(String, ResultSetExtractor<T>) in the type JdbcTemplate is not
applicable for the arguments (String, ResultSetExtractor)
我尝试了 Java 1.8 with Mockito 1.9.5 gives compile errors 的另一种方法:
Mockito.when(jdbcTemplate.query(Mockito.eq(expectedQuery1), Mockito.any()))
.thenReturn(mockReturn1);
现在我收到以下错误:
The method when(T) in the type Mockito is not applicable for the arguments (void)
这究竟应该如何工作以及为什么它首先不起作用
正在发生的事情是您正在传递类型为 Class<ResultSetExtractor>
的 mockito ResultSetExtractor.class
,但这是不正确的,因为它期望 Class<ResultSetExtractor<T>>
.
为了克服这个问题,定义一个方法如下:
@SuppressWarnings( "rawtypes" )
public static <T> Class<T> uncheckedClassCast( Class clazz )
{
if( clazz == null )
return null;
@SuppressWarnings( "unchecked" )
Class<T> result = (Class<T>)clazz;
return result;
}
并按如下方式使用:
Class<ResultSetExtractor<T>> resultSetExtractorClass =
uncheckedClassCast( ResultSetExtractor.class );
然后,在调用 mockito(或其他任何东西)时使用 resultSetExtractorClass
而不是 ResultSetExtractor.class
。
添加类型见证以帮助 Eclipse 编译器解决所有问题:
Mockito.when(jdbcTemplate.query(Mockito.eq(expectedQuery1),
Mockito.<ResultSetExtractor<TYPE>> any())).thenReturn(mockReturn1);
确保将 TYPE
替换为 mockReturn1
的类型。例如
String mockReturn1 = "result";
Mockito.when(jdbcTemplate.query(Mockito.eq(expectedQuery1),
Mockito.<ResultSetExtractor<String>> any())).thenReturn(mockReturn1);
我希望 Oracle Java 8 编译器能够自行解决这个问题,因为它改进了类型推断功能。