在界面上模拟clone()方法似乎不再适用于Mockito 2.1.0.下面的代码适用于Mockito 1.10.19但使用Mockito 2.1.0抛出IllegalAccessError:
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 bug列表并搜索了一下但没有发现任何内容.在与mockito团队提交错误报告之前,想先检查SO社区.
环境:JDK 1.8.0_102,JUnit 4.11,Mockito 2.1.0,Gradle 3.0,Windows 10
最佳答案
这是Mockito的一个错误.
@H_403_30@由于Object :: clone受到保护,并且由于Java优先于接口继承的子类继承,因此自动生成的子类会将clone重写为受保护的方法,而不是公共方法.当然,Mockito应该将所有被覆盖的方法都公之于众,但目前Mockito并没有这样做.然而,这无法解决.期望在将来的版本中解决此问题.