/* * Copyright (c) 2007 Mockito contributors * This program is made available under the terms of the MIT License. */ package org.powermock.api.mockito.repackaged; import org.powermock.api.mockito.repackaged.cglib.proxy.MethodProxy; import java.lang.reflect.Field; class CGLIBHacker { public void setMockitoNamingPolicy(MethodProxy methodProxy) { try { Field createInfoField = reflectOnCreateInfo(methodProxy); createInfoField.setAccessible(true); Object createInfo = createInfoField.get(methodProxy); Field namingPolicyField = createInfo.getClass().getDeclaredField("namingPolicy"); namingPolicyField.setAccessible(true); if (namingPolicyField.get(createInfo) == null) { namingPolicyField.set(createInfo, MockitoNamingPolicy.INSTANCE); } } catch (Exception e) { throw new RuntimeException( "Unable to set MockitoNamingPolicy on cglib generator which creates FastClasses", e); } } @SuppressWarnings("unchecked") private Field reflectOnCreateInfo(MethodProxy methodProxy) throws SecurityException, NoSuchFieldException { Class cglibMethodProxyClass = methodProxy.getClass(); // in case methodProxy was extended by user, let's traverse the object // graph to find the cglib methodProxy // with all the fields we would like to change while (cglibMethodProxyClass != MethodProxy.class) { cglibMethodProxyClass = methodProxy.getClass().getSuperclass(); } return cglibMethodProxyClass.getDeclaredField("createInfo"); } }