Насмешливая весенняя фасоль - PullRequest
4 голосов
/ 08 августа 2011

Я хотел бы продолжить этот вопрос.

Эти ответы foo и bar - это именно то, что мне нужно.

Но для примера bar пружина не определяет тип bean-компонента, возвращаемого из универсального метода mock (). Но на самом деле это точно так же, как в случае 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] ... при автопроводке.

@ Autowired public SomeType someType;

Почему это?

путь с MockFactoryBean довольно неудобен, потому что, если вам нужно высмеивать много бобов, вы в конечном итоге будете выглядеть так:

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

Потому что без идентификатора и имени это не выводит тип.

Ответы [ 3 ]

7 голосов
/ 28 сентября 2011

Когда XML-файл должен работать со стандартными банками spring / mockito, вы можете использовать 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 голосов
/ 10 октября 2012

Что я придумал:

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>

Надеюсь, это поможет тем, кто ищет решение

0 голосов
/ 08 августа 2011

Я сделал еще один шаг, добавив немного кода в FactoryBean, и продолжаю создавать настоящие макеты в своем тестовом классе. Вместо этого мой FactoryBean генерирует динамические прокси по мере необходимости при запуске Spring - которые не испытывают проблемы с типизацией, с которой вы сталкиваетесь - и тесты могут подключаться по мере необходимости. Я написал сообщение в блоге , в котором описывается, как это сделать. Эта статья посвящена тестированию класса ресурсов JAX-RS, но последний раздел может в значительной степени выступить в качестве альтернативного способа выполнения того, что вы пытаетесь сделать, если вы размыли материал JAX-RS. .

...