[英]Mocking Spring beans
我想繼續這個問題。
但是對於bar示例spring不會推斷從通用mock()方法返回的bean的類型。 但實際上它與MockFactoryBean情況完全相同,這是有效的。
class MockFactoryBean<T> implements FactoryBean<T> {
private Class<T> type;
public void setType(final Class<T> type) {
this.type = type;
}
@Override
public T getObject() throws Exception {
return (T) Mockito.mock(type);
}
@Override
public Class<T> getObjectType() {
return type;
}
@Override
public boolean isSingleton() {
return true;
}
}
加
<bean id="mockFactory" name="someType" class="com.example.MocksFactory" >
<property name="type" value="com.example.SomeType" />
</bean>
但是使用org.mockito.Mockito
和mock()
工廠方法不起作用
<bean id="dao" class="org.mockito.Mockito" factory-method="mock">
<constructor-arg value="com.example.SomeType" />
</bean>
並且當獲得自動裝配時,一個得到[com.example.SomeType]類型的匹配bean。
@Autowired public SomeType someType;
這是為什么 ?
使用MockFactoryBean的方式非常不方便,因為如果你必須模擬很多bean,你最終會像這樣:
<bean id="mockFactory1" name="metadataExtractor" class="tests.base.MocksFactory" >
<property name="type" value="processing.MetadataExtractor" />
</bean>
<bean id="mockFactory2" name="fileValidator" class="tests.base.MocksFactory" >
<property name="type" value="validation.file.FileValidator" />
</bean>
<bean id="mockFactory3" name="documentMatcher" class="tests.base.MocksFactory" >
<property name="type" value="validation.matching.DocumentMatcher" />
</bean>
<bean id="mockFactory4" name="uploadMatcher" class="tests.base.MocksFactory">
<property name="type" value="validation.matching.UploadMatcher" />
</bean>
<bean id="mockFactory5" name="tempFileLocalService" class="tests.base.MocksFactory">
<property name="type" value="service.TempFileLocalService" />
</bean>
<bean id="mockFactory6" name="orderLocalService" class="tests.base.MocksFactory">
<property name="type" value="service.OrderLocalService" />
</bean>
<bean id="mockFactory7" name="counterLocalService" class="tests.base.MocksFactory">
<property name="type" value="service.CounterLocalService" />
</bean>
因為沒有id和name,它不會推斷出類型。
當XML文件應該與標准的spring / mockito jar一起使用時,你可以使用ProxyFactoryBean,它可以用於自動裝配(在Spring 2.5上測試)。
<bean id="dao" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target"> <bean class="org.mockito.Mockito" factory-method="mock"> <constructor-arg value="com.package.Dao" /> </bean> </property>
<property name="proxyInterfaces"> <value>com.package.Dao</value> </property>
</bean>
我想出了什么:
public class SpringMocks implements ApplicationContextAware {
private static final Logger logger = LoggerFactory.getLogger(SpringMocks.class);
private final List<Class<?>> classes;
public SpringMocks(List<Class<?>> classes) {
this.classes = classes;
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
if (applicationContext instanceof GenericApplicationContext) {
GenericApplicationContext context = (GenericApplicationContext) applicationContext;
DefaultListableBeanFactory beanFactory = context.getDefaultListableBeanFactory();
for (Class<?> className : classes) {
String beanName = RandomStringUtils.randomAlphanumeric(10);
Object singletonObject = Mockito.mock(className);
beanFactory.registerSingleton(beanName, singletonObject);
}
} else {
logger.warn("unable to add beans to the context!");
}
}
}
而定義:
<bean class="com.whatever.SpringMocks">
<constructor-arg index="0">
<list>
<value>com.whatever.enricher.Enricher</value>
<value>com.whatever.nimbus.NimbusOrderDao</value>
<value>com.whatever.nimbus.NimbusAllocationDao</value>
<value>com.whatever.nimbus.NimbusExecutionDao</value>
<value>com.whatever.nimbus.NimbusBookingInstructionDao</value>
<value>com.whatever.services.SettingsService</value>
<value>com.whatever.matchers.utils.CVDataRetriever</value>
</list>
</constructor-arg>
</bean>
希望它能幫助那些正在尋找解決方案的人
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.