/
ProxyBasedMockFactory.java
63 lines (54 loc) · 2.68 KB
/
ProxyBasedMockFactory.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
/*
* Copyright 2012 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* https://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.spockframework.mock.runtime;
import org.spockframework.mock.*;
import org.spockframework.util.*;
import java.util.*;
/**
* Some implementation details of this class and the classes it references are inspired from Spring, EasyMock
* Class Extensions, JMock, Mockito, and this thread:
* https://www.nabble.com/Callbacks%2C-classes-and-instances-to4092596.html
*
* @author Peter Niederwieser
*/
public class ProxyBasedMockFactory {
private static final boolean ignoreByteBuddy = Boolean.getBoolean("org.spockframework.mock.ignoreByteBuddy");
private static final boolean byteBuddyAvailable = ReflectionUtil.isClassAvailable("net.bytebuddy.ByteBuddy");
private static final boolean cglibAvailable = ReflectionUtil.isClassAvailable("net.sf.cglib.proxy.Enhancer");
public static ProxyBasedMockFactory INSTANCE = new ProxyBasedMockFactory();
@Nullable
private final ByteBuddyMockFactory byteBuddyMockFactory;
private ProxyBasedMockFactory() {
if (byteBuddyAvailable && !ignoreByteBuddy) {
byteBuddyMockFactory = new ByteBuddyMockFactory();
} else {
byteBuddyMockFactory = null;
}
}
public Object create(Class<?> mockType, List<Class<?>> additionalInterfaces, @Nullable List<Object> constructorArgs,
IProxyBasedMockInterceptor mockInterceptor, ClassLoader classLoader, boolean useObjenesis) throws CannotCreateMockException {
if (mockType.isInterface()) {
return DynamicProxyMockFactory.createMock(mockType, additionalInterfaces, constructorArgs, mockInterceptor, classLoader);
}
if (byteBuddyMockFactory != null) {
return byteBuddyMockFactory.createMock(mockType, additionalInterfaces, constructorArgs, mockInterceptor, classLoader, useObjenesis);
}
if (cglibAvailable) {
return CglibMockFactory.createMock(mockType, additionalInterfaces, constructorArgs, mockInterceptor, classLoader, useObjenesis);
}
throw new CannotCreateMockException(mockType,
". Mocking of non-interface types requires a code generation library. Please put an up-to-date version of byte-buddy or cglib-nodep on the class path."
);
}
}