PageRenderTime 51ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 0ms

/TestSuite/ReferencedLibrariesJar/org/mockito/internal/configuration/DefaultInjectionEngine.java

http://cmpt371t1.googlecode.com/
Java | 96 lines | 68 code | 10 blank | 18 comment | 12 complexity | d4e6a4a3b001d24afcb80b25ecf2c499 MD5 | raw file
Possible License(s): Apache-2.0, MIT, MPL-2.0-no-copyleft-exception, BSD-3-Clause
  1. /*
  2. * Copyright (c) 2007 Mockito contributors
  3. * This program is made available under the terms of the MIT License.
  4. */
  5. package org.mockito.internal.configuration;
  6. import java.lang.reflect.Field;
  7. import java.util.ArrayList;
  8. import java.util.Collection;
  9. import java.util.List;
  10. import java.util.Set;
  11. import org.mockito.exceptions.base.MockitoException;
  12. import org.mockito.internal.util.MockUtil;
  13. import org.mockito.internal.util.reflection.FieldSetter;
  14. /**
  15. * Initializes mock/spies dependencies for fields annotated with @InjectMocks
  16. * <p/>
  17. * See {@link org.mockito.MockitoAnnotations}
  18. */
  19. public class DefaultInjectionEngine {
  20. private final MockUtil mockUtil = new MockUtil();
  21. // for each tested
  22. // - for each field of tested
  23. // - find mock candidate by type
  24. // - if more than *one* find mock candidate on name
  25. // - if one mock candidate then set mock
  26. // - else don't fail, user will then provide dependencies
  27. public void injectMocksOnFields(Set<Field> testClassFields, Set<Object> mocks, Object testClass) {
  28. for (Field field : testClassFields) {
  29. Object fieldInstance = null;
  30. boolean wasAccessible = field.isAccessible();
  31. field.setAccessible(true);
  32. try {
  33. fieldInstance = field.get(testClass);
  34. } catch (IllegalAccessException e) {
  35. throw new MockitoException("Problems injecting dependencies in " + field.getName(), e);
  36. } finally {
  37. field.setAccessible(wasAccessible);
  38. }
  39. // for each field in the class hierarchy
  40. Class<?> fieldClass = fieldInstance.getClass();
  41. while (fieldClass != Object.class) {
  42. injectMockCandidate(fieldClass, mocks, fieldInstance);
  43. fieldClass = fieldClass.getSuperclass();
  44. }
  45. }
  46. }
  47. private void injectMockCandidate(Class<?> awaitingInjectionClazz, Set<Object> mocks, Object fieldInstance) {
  48. // TODO refactor using a CoR, maybe configured with config.
  49. for(Field field : awaitingInjectionClazz.getDeclaredFields()) {
  50. List<Object> mockCandidates = selectMockCondidatesOnType(mocks, field.getType());
  51. if(mockCandidates.size() > 1) {
  52. mockCandidates = selectMockCandidateOnName(mockCandidates, field.getName());
  53. }
  54. if(mockCandidates.size() == 1) {
  55. inject(field, fieldInstance, mockCandidates.get(0));
  56. } else {
  57. // don't fail, the user need to provide other dependencies
  58. }
  59. }
  60. }
  61. private void inject(Field field, Object fieldInstance, Object matchingMock) {
  62. try {
  63. new FieldSetter(fieldInstance, field).set(matchingMock);
  64. } catch (Exception e) {
  65. throw new MockitoException("Problems injecting dependency in " + field.getName(), e);
  66. }
  67. }
  68. private List<Object> selectMockCandidateOnName(Collection<Object> mocks, String fieldName) {
  69. List<Object> mockNameMatches = new ArrayList<Object>();
  70. for (Object mock : mocks) {
  71. if(fieldName.equals(mockUtil.getMockName(mock).toString())) {
  72. mockNameMatches.add(mock);
  73. }
  74. }
  75. return mockNameMatches;
  76. }
  77. private List<Object> selectMockCondidatesOnType(Collection<Object> mocks, Class<?> fieldClass) {
  78. List<Object> mockTypeMatches = new ArrayList<Object>();
  79. for (Object mock : mocks) {
  80. if(fieldClass.isAssignableFrom(mock.getClass())) {
  81. mockTypeMatches.add(mock);
  82. }
  83. }
  84. return mockTypeMatches;
  85. }
  86. }