/* * Copyright (c) 2007 Mockito contributors * This program is made available under the terms of the MIT License. */ package org.mockitousage.annotation; import org.assertj.core.api.Assertions; import org.junit.Before; import org.junit.Test; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.mockito.Spy; import org.mockito.exceptions.base.MockitoException; import org.mockito.internal.util.MockUtil; import org.mockitousage.IMethods; import org.mockitoutil.TestBase; import java.util.List; import java.util.Map; import java.util.Set; import java.util.TreeSet; import static junit.framework.TestCase.*; @SuppressWarnings({"unchecked", "unused"}) public class MockInjectionUsingSetterOrPropertyTest extends TestBase { private SuperUnderTesting superUnderTestWithoutInjection = new SuperUnderTesting(); @InjectMocks private SuperUnderTesting superUnderTest = new SuperUnderTesting(); @InjectMocks private BaseUnderTesting baseUnderTest = new BaseUnderTesting(); @InjectMocks private SubUnderTesting subUnderTest = new SubUnderTesting(); @InjectMocks private OtherBaseUnderTesting otherBaseUnderTest = new OtherBaseUnderTesting(); @InjectMocks private HasTwoFieldsWithSameType hasTwoFieldsWithSameType = new HasTwoFieldsWithSameType(); private BaseUnderTesting baseUnderTestingInstance = new BaseUnderTesting(); @InjectMocks private BaseUnderTesting initializedBase = baseUnderTestingInstance; @InjectMocks private BaseUnderTesting notInitializedBase; @Spy @InjectMocks private SuperUnderTesting initializedSpy = new SuperUnderTesting(); @Spy @InjectMocks private SuperUnderTesting notInitializedSpy; @Mock private Map<?, ?> map; @Mock private List<?> list; @Mock private Set<?> histogram1; @Mock private Set<?> histogram2; @Mock private IMethods candidate2; @Spy private TreeSet<String> searchTree = new TreeSet<String>(); @Before public void enforces_new_instances() { // initMocks called in TestBase Before method, so instances are not the same MockitoAnnotations.initMocks(this); } @Test public void should_keep_same_instance_if_field_initialized() { assertSame(baseUnderTestingInstance, initializedBase); } @Test public void should_initialize_annotated_field_if_null() { assertNotNull(notInitializedBase); } @Test public void should_inject_mocks_in_spy() { assertNotNull(initializedSpy.getAList()); assertTrue(MockUtil.isMock(initializedSpy)); } @Test public void should_initialize_spy_if_null_and_inject_mocks() { assertNotNull(notInitializedSpy); assertNotNull(notInitializedSpy.getAList()); assertTrue(MockUtil.isMock(notInitializedSpy)); } @Test public void should_inject_mocks_if_annotated() { MockitoAnnotations.initMocks(this); assertSame(list, superUnderTest.getAList()); } @Test public void should_not_inject_if_not_annotated() { MockitoAnnotations.initMocks(this); assertNull(superUnderTestWithoutInjection.getAList()); } @Test public void should_inject_mocks_for_class_hierarchy_if_annotated() { MockitoAnnotations.initMocks(this); assertSame(list, baseUnderTest.getAList()); assertSame(map, baseUnderTest.getAMap()); } @Test public void should_inject_mocks_by_name() { MockitoAnnotations.initMocks(this); assertSame(histogram1, subUnderTest.getHistogram1()); assertSame(histogram2, subUnderTest.getHistogram2()); } @Test public void should_inject_spies() { MockitoAnnotations.initMocks(this); assertSame(searchTree, otherBaseUnderTest.getSearchTree()); } @Test public void should_insert_into_field_with_matching_name_when_multiple_fields_of_same_type_exists_in_injectee() { MockitoAnnotations.initMocks(this); assertNull("not injected, no mock named 'candidate1'", hasTwoFieldsWithSameType.candidate1); assertNotNull("injected, there's a mock named 'candidate2'", hasTwoFieldsWithSameType.candidate2); } @Test public void should_instantiate_inject_mock_field_if_possible() throws Exception { assertNotNull(notInitializedBase); } @Test public void should_keep_instance_on_inject_mock_field_if_present() throws Exception { assertSame(baseUnderTestingInstance, initializedBase); } @Test public void should_report_nicely() throws Exception { Object failing = new Object() { @InjectMocks ThrowingConstructor failingConstructor; }; try { MockitoAnnotations.initMocks(failing); fail(); } catch (MockitoException e) { Assertions.assertThat(e.getMessage()).contains("failingConstructor").contains("constructor").contains("threw an exception"); Assertions.assertThat(e.getCause()).isInstanceOf(RuntimeException.class); } } static class ThrowingConstructor { ThrowingConstructor() { throw new RuntimeException("aha"); } } static class SuperUnderTesting { private List<?> aList; public List<?> getAList() { return aList; } } static class BaseUnderTesting extends SuperUnderTesting { private Map<?, ?> aMap; public Map<?, ?> getAMap() { return aMap; } } static class OtherBaseUnderTesting extends SuperUnderTesting { private TreeSet<?> searchTree; public TreeSet<?> getSearchTree() { return searchTree; } } static class SubUnderTesting extends BaseUnderTesting { private Set<?> histogram1; private Set<?> histogram2; public Set<?> getHistogram1() { return histogram1; } public Set<?> getHistogram2() { return histogram2; } } static class HasTwoFieldsWithSameType { private IMethods candidate1; private IMethods candidate2; } }