1e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson/*
2e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * Copyright (c) 2007 Mockito contributors
3e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * This program is made available under the terms of the MIT License.
4e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson */
5e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonpackage org.mockito.internal.configuration;
6e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
7e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.ArgumentCaptor;
8e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.Captor;
9e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.exceptions.base.MockitoException;
10e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.internal.util.reflection.GenericMaster;
11e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
12e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport java.lang.reflect.Field;
13e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
14e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson/**
15e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * Instantiate {@link ArgumentCaptor} a field annotated by @Captor.
16e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson */
17e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonpublic class CaptorAnnotationProcessor implements FieldAnnotationProcessor<Captor> {
18e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public Object process(Captor annotation, Field field) {
19e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        Class<?> type = field.getType();
20e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        if (!ArgumentCaptor.class.isAssignableFrom(type)) {
21e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            throw new MockitoException("@Captor field must be of the type ArgumentCaptor.\n" + "Field: '"
22e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson               + field.getName() + "' has wrong type\n"
23e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson               + "For info how to use @Captor annotations see examples in javadoc for MockitoAnnotations class.");
24e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        }
25e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        Class cls = new GenericMaster().getGenericType(field);
26e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        return ArgumentCaptor.forClass(cls);
27e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
28e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson}
29