带有Mockito 1.9.5的Java 1.8给出了编译错误



切换到Java 1.8后。JDK中我的一些测试类无法编译。实现类的例子:

import java.util.concurrent.Callable;
import java.util.concurrent.Future;
public class ImplClass {
    public <T> Future<T> executeTask(final Callable<T> task) {
        return null;
    }
}

下面是Mockito的测试类:

import static org.mockito.Matchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.util.concurrent.Callable;
import org.junit.Before;
public class TestClass {
    private ImplClass implClassMock;
    @Before
    public void setUp() {
        implClassMock = mock(ImplClass.class);
        when(implClassMock.executeTask(any(Callable.class))).thenReturn(null);
    }
}

我得到错误信息:The method executeTask(Callable<T>) in the type ImplClass is not applicable for the arguments (Callable)

切换回java编译器1.7,一切正常

你知道怎么解决这个问题吗?

从java 8开始,编译器的类型推断得到了很大的改进。

现在您可以从匹配器中删除类参数,而不会出现任何编译警告:

when(implClassMock.executeTask(any())).thenReturn(null);

注意:我有相同的编译失败,但只与eclipse。

看起来这是因为javac比JLS更灵活。遵从级别为1.8的Eclipse编译器更严格:https://bugs.eclipse.org/bugs/show_bug.cgi?id=430987

@gontard的答案在大多数情况下都是有效的,但是如果您要存根的方法有不同参数类型的覆盖,javac将会感到困惑。例如,ExecutorService.submit()接受Callable和Runnable作为参数,你不能用when(executor.submit(any())).then(…)来模拟它,因为它是模糊的。但是,像这样显式地对类型进行参数化将使eclipse和javac编译器都满意:

when(executor.<Object>submit(any(Callable.class)).then(...)

相关内容

  • 没有找到相关文章

最新更新