2011-08-07 148 views
4

我想繼續this的問題。嘲笑春豆

這些答案foobar正是我所需要的。

但是對於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; 
    } 
} 
使用 org.mockito.Mockitomock()工廠方法不起作用

<bean id="dao" class="org.mockito.Mockito" factory-method="mock"> 
    <constructor-arg value="com.example.SomeType" /> 
</bean> 

和一個

<bean id="mockFactory" name="someType" class="com.example.MocksFactory" > 
    <property name="type" value="com.example.SomeType" /> 
</bean> 

,但得到類型[com.example.SomeType]中沒有匹配豆..當自動裝配時。

@Autowired public SomeType someType;

這是爲什麼?

<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 &名不推斷類型:

與MockFactoryBean的方式,因爲如果你有嘲笑許多豆子,你落得像這是相當不方便。

+0

[這](HTTP ://stackoverflow.com/a/12352317/448078)例子對我來說很酷。 –

回答

0

我在FactoryBean中稍微多了一點代碼,並在測試類中保留了真正的模擬創建。相反,我的FactoryBean在Spring啓動時根據需要生成動態代理 - 不會遇到您所看到的輸入問題 - 並且測試可以根據需要進行模擬連接。我寫了一篇描述如何做的blog post。這篇文章專門介紹測試一個JAX-RS資源類,但是last section幾乎可以作爲一種替代方式來做你正在嘗試的東西,如果你模糊了JAX-RS的東西。

+0

它做得很好,但我習慣了僅僅留下一眼就看得見的解決方案。這需要大量的注意力,甚至可以得到它,並且在一段時間後它會對其他程序員和我自己重複使用:-) – lisak

+0

@lisak:我喜歡使用它,原因正好相反:它可以讓您繼續以相同的方式編寫測試像往常一樣,所以沒有什麼新習慣。 –

7

當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> 
0

我想出了:

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> 

希望這將有助於那些誰正在尋找解決方案