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 编译器能够自行解决这个问题,因为它改进了类型推断功能。