2016-10-10 3 views
5

Смысл метода clone() на интерфейсе больше не работает с Mockito 2.1.0. Ниже код работает отлично с Mockito 1.10.19 но бросает IllegalAccessError с Mockito 2.1.0:Mocking interface clone method

public interface CloneableInterface extends Cloneable { 
    CloneableInterface clone(); 
} 

public class CloneableInterfaceTest { 

    @Test 
    public void test() {  
    CloneableInterface i = Mockito.mock(CloneableInterface.class); 
    Mockito.when(i.clone()).thenReturn(i); // Throws IllegalAccessError 
    } 
} 

Результатом работы над тестом:

java.lang.IllegalAccessError: CloneableInterface$MockitoMock$833899610.clone()LCloneableInterface; 

Я проверил список ошибок Mockito и немного погуглил, но ничего не нашел. Хотелось проверить SO сообщество прежде, чем подать отчет об ошибке с командой mockito.

Окружающая среда: JDK 1.8.0_102, JUnit 4,11, Mockito 2.1.0, Gradle 3,0, для Windows 10

EDIT: Поданный ошибка с Mockito командой here

ответ

3

Это ошибка в Мокито.

Поскольку Object::clone является protected и так как Java, способствует наследованию подкласса над наследованием интерфейса, автоматически генерируемый подкласс переопределяет clone как метод protected, а не метод public. Конечно, Mockito должен отображать все переопределенные методы как public, но в настоящее время Mockito этого не делает. Это, однако, тривиально, чтобы исправить. Ожидайте, что это будет разрешено в будущей версии.

+1

Ничего себе, исправление через ~ 35 минут после сообщения об этой ошибке на githum. Очень впечатлен. – jenglert