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(...)