/*
 * Copyright 2011 Google Inc.
 *
 * 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
 *
 *     http://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 com.google.testing.littlemock;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * Used to automatically inject a {@link ArgumentCaptor} object for use in your tests.
 *
 * <p>Just annotate your capture field on your test as follows:
 * <pre>
 *   &#64;Captor private ArgumentCaptor&lt;String&gt; mCaptureString;
 * </pre>
 *
 * <p>Then when the {@link LittleMock#initMocks(Object)} method is called (which should be
 * done in your setUp() call, or in a test base class) all your capture objects will be
 * automatically constructed.
 *
 * @author hugohudson@gmail.com (Hugo Hudson)
 */
@Target({ ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
public @interface Captor {
}
