Инъекция макета в контейнер Spring без xml для тестирования - PullRequest
2 голосов
/ 09 мая 2011

В настоящее время мое весеннее приложение подключено с использованием @Autowired, @Component, @Resource и т. Д. Теперь я хочу написать тест, который требует проверки конкретных объектов в системе, но с сохранением реальной производственной проводки оставшихся объектов.

Допустим, тестируемый корневой объект называется Foo . Глубже по цепочке зависимостей Foo зависит от Bar. В настоящее время для макета этого объекта я создал test-applicationContext.xml, в котором есть только одна запись компонента:

<bean id="bar" class="org.mockito.Mockito" factory-method="mock"> 
    <constructor-arg value="com.package.Bar" /> 
</bean>

test-applicationContext.xml объявлен в аннотации @ContextConfiguration, и поэтому Foo в конечном итоге будет зависеть от объекта Mocked Bar.

Можно ли получить тот же результат, не имея этого test-applicationContext.xml? то есть делать то же самое, но программно?

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

public class MyTest {

    @Test
    public void simple() {
        // create mock Bar object
        // register mock Bar object in container
        // resolve Foo object with all its dependencies but use the mock Bar object instead of the real one
        // set some expectations on the Bar object
        // call some method on Foo
    }
}

Ответы [ 3 ]

3 голосов
/ 09 мая 2011

Вы должны избегать запуска контекста Spring в своих модульных тестах.Используйте контекст Spring только в тестах, которые проверяют внедрение свойств и другие функции Spring.Затем вы сможете создавать программно фиктивные объекты.

Хотя это можно сделать с помощью чего-то вроде:

  BeanDefinitionRegistry registry = ((BeanDefinitionRegistry )factory);

  GenericBeanDefinition beanDefinition = new GenericBeanDefinition();
  beanDefinition.setBeanClass(MyBeanClass.class);
  beanDefinition.setLazyInit(false);
  beanDefinition.setAbstract(false);
  beanDefinition.setAutowireCandidate(true);
  beanDefinition.setScope("session");

  registry.registerBeanDefinition("dynamicBean",beanDefinition);

Просто введите ваш BeanFactory в JUnit, чтобы получить фабрику

0 голосов
/ 01 января 2016

У меня была очень похожая проблема, и я использовал https://bitbucket.org/kubek2k/springockito/wiki/Home, который был мне очень полезен.

В вашем случае вы можете использовать, если хотите общий макет, тогда используйте @ReplaceWithMock или вы можете использовать @WrapWithSpy, который будет выполнять частичный макет, и только вы можете смоделировать функцию, для которой хотите изменить поведение.

0 голосов
/ 09 мая 2011

Один из способов сделать это:

  1. В вашем тестовом контексте компонентное сканирование минимума.

  2. @ Автоматически связать зависимости Bar в ваш тестовый класс.

В вашем наборе:

  1. Вручную new Bar()

  2. Создать макет Foo

  3. Установить свойства нового бара, включая @Autowired (первый # 2) и макет (второй # 2).

...