blob: 1bf18a393a0fb12cdc9c31db10fccdf7f3589420 [file] [log] [blame]
/*
* 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;
}
}