Сделайте макет всех трансформаторов в цепочке ETL в один макет - PullRequest
0 голосов
/ 13 июля 2020

Я работаю над приложением ETL, где цепочка ETL поддерживается в Spring beans. Что-то вроде:

<bean id="extractor" children="t1" />
<bean id="t1" children="t2" />
<bean id="t2" children="t3" />
<bean id="t3" children=null />

И классы выглядят так:

class Transformer {
    Transformer [] children = [Transformer with secret S2]
    String secret = "S1";
    public doSomething() {
        
    }
}

Class Transformer {
    Transformer [] children = [Transformer with secret S3]
    String secret = "S2";
    public doSomething() {

    }
}

Class Transformer {
    Transformer [] children = null;
    String secret = "S3";
    public doSomething() {
        
    }
}

А экстрактор выглядит так:

class Extractor  {
    public transform(Transformer n) {
        n.doSomething();
        for(Transformer c: n.children) {
            extractor(c);
        }
    }
}

Трансформаторы имеют данные, связанные с базой данных и, следовательно, будут нравится издеваться над ними. Один из вариантов - дублировать цепочку Spring bean etl с ложными трансформаторами, но мне не нравится дублирование. Плюс его было бы сложно поддерживать. Мне также не нужен отдельный макет для каждого Transformer.

У меня есть доступ к реальному экземпляру Extractor, но после запуска extractor () я хотел бы имитировать doSomething () всех экземпляров Transformer.

Возможно ли это?

1 Ответ

0 голосов
/ 21 июля 2020

Итак, чтобы решить эту проблему, я добавил bean-компонент ETLBeanPostProcessor в свой весенний контекст. В нем я сделал что-то вроде

class PostProcessor implements ETLBeanPostProcessor {
    public Object postProcessAfterInitialization(final Object bean, final String beanName) throws BeansException {
        @Override
        if (bean instanceof Transformer) {
            final Transformer transformer = (Transformer) Mockito.spy(bean);
            // mock whatever you want
            return transformer;
        }
        return bean;
    }
}

Таким образом я могу сделать что-то конкретное c для всех экземпляров Transformer.

...