@Override protected <T> T createMock( Class<T> type, boolean isStatic, boolean isSpy, Object delegator, MockSettings mockSettings, Method... methods) { if (type == null) { throw new IllegalArgumentException("The class to mock cannot be null"); } validateType(type, isStatic, isSpy); final String mockName = toInstanceName(type, mockSettings); MockRepository.addAfterMethodRunner(new MockitoStateCleanerRunnable()); final Class<T> typeToMock; if (isFinalJavaSystemClass(type)) { typeToMock = (Class<T>) new ClassReplicaCreator().createClassReplica(type); } else { typeToMock = type; } final MockData<T> mockData = createMethodInvocationControl( mockName, typeToMock, methods, isSpy, delegator, mockSettings); T mock = mockData.getMock(); if (isFinalJavaSystemClass(type) && !isStatic) { mock = Whitebox.newInstance(type); DefaultFieldValueGenerator.fillWithDefaultValues(mock); } if (isStatic) { MockRepository.putStaticMethodInvocationControl(type, mockData.getMethodInvocationControl()); } else { MockRepository.putInstanceMethodInvocationControl( mock, mockData.getMethodInvocationControl()); } if (isSpy) { new LenientCopyTool().copyToMock(delegator, mock); } return mock; }