2011-08-07 97 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> 

希望这将有助于那些谁正在寻找解决方案