package uk.ac.gda.test.helpers.springmock; import static org.mockito.Mockito.when; import java.lang.reflect.Method; import java.util.Map; import org.mockito.Mockito; import org.springframework.beans.factory.FactoryBean; import org.springframework.beans.factory.annotation.Autowired; /** * A {@link FactoryBean} for creating mocked beans based on Mockito so that they can be {@link Autowired} into Spring * test configurations. Allows simple stubbing of methods for when you want the mock to return particular value when * particular method is called. * * @see org.mockito.Mockito <pre> * <bean id="pco1_hdf5_Zebra" class="uk.ac.gda.test.helpers.springmock.MockitoFactoryBean"> * <constructor-arg name="classToBeMocked" * value="gda.device.detector.nxdetector.NXPlugin" /> * <constructor-arg name="properties"> * <map> * <entry key="getName" value="pco1_hdf5_Zebra" /> * </map> * </constructor-arg> * </bean> * </pre> **/ public class MockitoFactoryBean<T> implements FactoryBean<T> { private Class<T> classToBeMocked; /** * Creates a Mockito mock instance of the provided class. * * @param classToBeMocked * The class to be mocked. */ public MockitoFactoryBean(Class<T> classToBeMocked, Map<String, Object> properties) { this.classToBeMocked = classToBeMocked; this.properties = properties; } public MockitoFactoryBean(Class<T> classToBeMocked) { this(classToBeMocked, null); } final Map<String, Object> properties; @Override public T getObject() throws Exception { T mock = Mockito.mock(classToBeMocked); if (properties != null) { Class<? extends Object> class1 = mock.getClass(); for (String methodName : properties.keySet()) { Method method = class1.getMethod(methodName, (Class[]) null); when(method.invoke(mock, (Object[]) null)).thenReturn(properties.get(methodName)); } } return mock; } @Override public Class<?> getObjectType() { return classToBeMocked; } @Override public boolean isSingleton() { return true; } }