package org.testfun.jee.runner.inject;
import org.testfun.jee.runner.EjbWithMockitoRunnerException;
import java.lang.reflect.Field;
public class InjectionUtils {
public static <T> Class<?> getFieldInterface(T target, Field field) {
Class<?> fieldClass = field.getType();
if (!fieldClass.isInterface()) {
throw new EjbWithMockitoRunnerException(getFieldDescription(field, target) + " isn't an interface");
}
return fieldClass;
}
public static <T> void assignObjectToField(T target, Field field, Object value) {
boolean fieldAccessible = field.isAccessible();
field.setAccessible(true);
try {
field.set(target, value);
} catch (Exception e) {
throw new EjbWithMockitoRunnerException("Failed injecting to " + getFieldDescription(field, target), e);
} finally {
field.setAccessible(fieldAccessible);
}
}
@SuppressWarnings("unchecked")
public static <T,O> O readObjectFromField(T target, Field field) {
boolean fieldAccessible = field.isAccessible();
field.setAccessible(true);
try {
return (O) field.get(target);
} catch (Exception e) {
throw new EjbWithMockitoRunnerException("Failed to read from " + getFieldDescription(field, target), e);
} finally {
field.setAccessible(fieldAccessible);
}
}
public static <T> String getFieldDescription(Field field, T target) {
Class<?> targetClass = target.getClass();
Class<?> fieldDeclaringClass = field.getDeclaringClass();
if (targetClass.equals(fieldDeclaringClass)) {
return "field '" + field.getName() + "' declared in " + targetClass;
} else {
return "field '" + field.getName() + "' declared in " + fieldDeclaringClass + " (superclass of " + targetClass + ")";
}
}
}