Java 1.8 с Mockito 1.9.5 дает ошибки компиляции

После перехода на 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 все в порядке.

Любая идея, как решить эту проблему?

Ответ 1

Так как java 8, вывод типа компилятора значительно улучшились.

Теперь вы можете удалить параметр класса из соединителя без предупреждения о компиляции:

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

Примечание. У меня тот же самый сбой компилятора, но только с eclipse. Может быть ошибка?

Ответ 2

Похоже, это вызвано тем, что javac является более гибким, чем требует JLS. Компилятор Eclipse с уровнем соответствия 1.8 более строгий: https://bugs.eclipse.org/bugs/show_bug.cgi?id=430987

Ответ от @gontard работает в большинстве случаев, но если метод, который вы выполняете, имеет переопределения с разными типами параметров, javac будет запутан. Например, ExecutorService.submit() принимает как Callable, так и Runnable в качестве параметров, вы не можете имитировать его с помощью (executor.submit(any())), а затем (...), поскольку он неоднозначен. Но явно параметризируя тип, подобный этому, будет сохраняться как компилятор eclipse, так и javac:

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