@Override public <T> T getLegalForParam(int paramPosition) { Type type = method. getGenericParameterTypes()[paramPosition]; MockeryMetadata mockery = mockeryMetadata .fromParam(providersClass, method, null, paramPosition); checkSupportType.from(providersClass, method, mockery, type); return (T) mockery.legal(); }
private MockeryMetadata mockeryMetadata(Class<?> mockingClass, Method method, Object[] args, Type type, Annotation[] annotations) { List<MockeryMetadata> mockeriesMetadata = new ArrayList<>(); for (Annotation annotation : annotations) { Mockery mockeryAnnotation = annotation.annotationType() .getAnnotation(Mockery.class); if (mockeryAnnotation == null) continue; Metadata metadata = new Metadata<>(mockingClass, method, args, annotation, type); Mockery.Behaviour mockery = instantiateInterface.from(mockeryAnnotation.value()); mockeriesMetadata.add(new MockeryMetadata(metadata, mockery)); } if (mockeriesMetadata.isEmpty()) return null; if (mockeriesMetadata.size() > 1) { String message = Messages .multipleMockeryOnMethodOrParam(mockingClass, method); throw new IllegalArgumentException(message); } return mockeriesMetadata.get(0); }
@Override public <T> T getIllegalForParam(int paramPosition) { Type type = method. getGenericParameterTypes()[paramPosition]; MockeryMetadata mockery = mockeryMetadata .fromParam(providersClass, method, null, paramPosition); checkSupportType.from(providersClass, method, mockery, type); return (T) mockery.illegal(); }
private void applyValidationsToParams(Method method, Object[] args) { Type[] typeParams = method.getGenericParameterTypes(); for (int i = 0; i < typeParams.length; i++) { Type typeParam = typeParams[i]; MockeryMetadata mockery = getMockeryMetadata .fromParam(mockingClass, method, args, i); if (mockery == null) { String message = Messages.noMockeryFoundOnParam(mockingClass, method, i); throw new RuntimeException(message); } checkSupportType.from(mockingClass, method, mockery, typeParam); Object valueParam = args[i]; mockery.validate(valueParam); } }
public void from(Class mockingClass, Method method, MockeryMetadata mockery, Type candidate) { Type[] supportedTypes = mockery.supportedTypes(); for (Type supportedType : supportedTypes) { if (supportedType.toString().replace("? extends ", "") .equals(candidate.toString())) { return; } } String message = Messages.notSupportedTypeForMockery(mockingClass, method, mockery, candidate, supportedTypes); throw new RuntimeException(message); } }
@Override public void validateResponse(Object response) { interceptorMetadata.validate(response); Type typeMethod = method.getGenericReturnType(); Type adaptedTypeMethod = interceptorMetadata.adaptType(typeMethod); Object adaptedResponse = interceptorMetadata.adaptResponse(response); MockeryMetadata mockeryMethod = mockeryMetadata .fromMethod(providersClass, method, adaptedTypeMethod, null); checkSupportType.from(providersClass, method, mockeryMethod, adaptedTypeMethod); mockeryMethod.validate(adaptedResponse); }
@Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if (method.getDeclaringClass() == Object.class) { return method.invoke(this, args); } InterceptorMetadata interceptor = getInterceptorMetadata. with(mockingClass, method, args); try { applyValidationsToParams(method, args); Type adaptedTypeMethod = interceptor .adaptType(method.getGenericReturnType()); MockeryMetadata mockery = getMockeryMetadata .fromMethod(mockingClass, method, adaptedTypeMethod, args); checkSupportType.from(mockingClass, method, mockery, adaptedTypeMethod); Object response = mockery.legal(); return interceptor.onLegalMock(response); } catch (AssertionError e) { return interceptor.onIllegalMock(e); } }
@Test public void When_Get_Mockery_Metadata_From_Method_With_One_Mockery_Get_Mockery_Metadata() throws NoSuchMethodException { Method method = Providers.class.getMethod("oneMockeryMethod"); Type type = method.getGenericReturnType(); MockeryMetadata mockeryMetadata = getMockeryMetadata .fromMethod(Providers.class, method, type, null); mockeryMetadata.legal(); assertNotNull(mockeryMetadata); }