AutowireCapableBeanFactory factory =testContext.getApplicationContext().getAutowireCapableBeanFactory(); //Autowired注解注入mock对象 for (Field field :injectFields) { field.setAccessible(true); Object object = field.get(bean); if(objectinstanceof Proxy){ Class targetClass = AopUtils.getTargetClass(object); if(targetClass ==null) return; Field[] targetFields =targetClass.getDeclaredFields(); for(Field targetField : targetFields){ targetField.setAccessible(true); if(mockObjectMap.get(targetField.getName()) ==null){ continue; } targetField.set(getTargetObject(object,mockObjectMap.get(targetField.getName()).getType()),mockObjectMap.get(targetField.getName()).getObj()); } }else{ Object realObject = factory.getBean(field.getName()); if(null != realObject){ Method[] methods = realObject.getClass().getDeclaredMethods(); for (Method method : methods) { if(method.getName().equalsIgnoreCase("set" +field.getName())){ method.invoke(realObject, mockObjectMap.get(field.getName()).getObj()); } } } } } } |
5.3 测试类配置
使用@TestExecutionListeners注解,引入监听器,需要mock的对象加上@Mock注解。
@TestExecutionListeners({MockitoDependencyInjectionTestExecutionListener.class}) public class AccessServiceImplTest extends BaseTestCase{ @Autowired private IAccessServiceaccessService; @Mock private IPersonServicepersonService; @Mock private IAccessDaoaccessDao; } |
6.总结
监听器的方式解放了代码中硬编码注入mock对象,使得代码简洁干净。