/*
 * Copyright (c) 2007 Mockito contributors
 * This program is made available under the terms of the MIT License.
 */
package org.mockitousage.annotation;

import org.junit.Before;
import org.junit.Test;
import org.mockito.MockitoAnnotations;
import org.mockito.Spy;
import org.mockito.internal.util.MockUtil;
import org.mockitoutil.TestBase;

import java.util.LinkedList;
import java.util.List;

import static junit.framework.TestCase.assertTrue;
import static org.mockito.internal.util.MockUtil.isMock;

@SuppressWarnings("unchecked")
public class SpyAnnotationInitializedInBaseClassTest extends TestBase {

    class BaseClass {

        @Spy
        List list = new LinkedList();
    }

    class SubClass extends BaseClass {

    }

    @Test
    public void shouldInitSpiesInBaseClass() throws Exception {
        //given
        SubClass subClass = new SubClass();
        //when
        MockitoAnnotations.initMocks(subClass);
        //then
        assertTrue(MockUtil.isMock(subClass.list));
    }

    @Before
    @Override
    public void init() {
        //we need to get rid of parent implementation this time
    }

    @Before
    public void before() {
        MockitoAnnotations.initMocks(this);
    }

    @Spy
    List spyInBaseclass = new LinkedList();

    public static class SubTest extends SpyAnnotationInitializedInBaseClassTest {

        @Spy
        List spyInSubclass = new LinkedList();

        @Test
        public void shouldInitSpiesInHierarchy() throws Exception {
            assertTrue(isMock(spyInSubclass));
            assertTrue(isMock(spyInBaseclass));
        }
    }
}