Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/113.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 8 Mockito Java 8编译错误_Java 8_Mockito - Fatal编程技术网

Java 8 Mockito Java 8编译错误

Java 8 Mockito Java 8编译错误,java-8,mockito,Java 8,Mockito,我刚转到Java8,我遇到了一些编译错误,我真的不知道如何克服这些错误 以下代码未编译: Mockito.when( jdbcTemplate.query(Mockito.eq(expectedQuery1), Mockito.any(ResultSetExtractor.class))).thenReturn(mockReturn1); 有误: The method query(String, ResultSetExtractor<T>) in the t

我刚转到Java8,我遇到了一些编译错误,我真的不知道如何克服这些错误

以下代码未编译:

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)
现在我得到以下错误:

The method when(T) in the type Mockito is not applicable for the arguments (void)

这到底应该如何工作,为什么它首先不工作?发生的是,您正在传递mockito
ResultSetExtractor.class
,它的类型是
class
,但这是不正确的,因为它需要一个

要解决此问题,请定义如下方法:

@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 );
@SuppressWarnings(“rawtypes”)
公共静态类未选中ClassCast(类clazz)
{
if(clazz==null)
返回null;
@抑制警告(“未选中”)
类结果=(类)clazz;
返回结果;
}
并按如下方式使用:

@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 );
Class ResultSetTextRactorClass=
取消选中ClassCast(resultSetTextRactor.class);

然后,在调用mockito(或其他任何内容)时,使用
ResultSetTextRactorClass
而不是
ResultSetTextRactor.class

添加类型见证,以帮助Eclipse编译器解决所有问题:

Mockito.when(jdbcTemplate.query(Mockito.eq(expectedQuery1),
        Mockito.<ResultSetExtractor<TYPE>> any())).thenReturn(mockReturn1);

我希望Oracle Java 8编译器能够自己解决这个问题,因为它改进了类型推断功能。

这里不需要执行未经检查的强制转换。请参阅我的答案,了解使用类型见证人的正确方法。(虽然我认为只有Eclipse编译器在这里遇到了问题)。尽管Duncan的回答更为优雅,但我相信您的回答将帮助那些遇到mockito和java 8问题并需要更复杂解决方案的人。@Gleeb实际上,我的回答适用于您遇到类似问题的任何情况,不仅仅是McCito to这个特定的问题。@ Geeeb,我的回答的下一个投票可能是邓肯从第2条中得到的建议:许多人认为道德上是反感的。我本可以对Duncan做同样的事情,但我没有。投票给你,让你像朋友一样回答:)谢谢你的帮助当然,当调用
any()
时,你可以这样做,而不需要参数。但最初的问题主要是关于使用参数调用
any()
。不能为
any()
指定与传递给它的参数类型不一致的泛型参数。你不能做
Mockito.any(X.class)
@MikeNakis我真的不明白你的意思。OP试图模拟对
query()
调用的适当响应。为了能够返回类型
T
,他必须将调用与
ResultSetExtractor
(或者可能是
ResultSetExtractor)匹配