Как создать макет / пустышку Исходный контекст для тестов Junit вне контейнера - PullRequest
0 голосов
/ 12 апреля 2011

Я столкнулся с большой проблемой создания экземпляра weblogic Initial context при запуске тестов jUnit. Приложение использует Spring / Hibernate / Weblogic. В коде приложения методы используют JMS-прокси для отправки сообщений в JMS, очереди настраиваются на weblogic.

Моя проблема заключается в том, что в то время как JUnit тестирует, мне нужно, чтобы сервер weblogic работал на локальном компьютере, чтобы инициализировать WeblogicInitialContext, который используется в прокси JMS. Моему тесту junit не нужно ничего отправлять на сервер, без JMS, без источников данных. Все они управляются рамками пружинных юнит-тестов. Я хочу отделить / избавиться от Weblogic для моих тестов Junit. Пожалуйста, предложите. Вот мой код:

Это мой тестовый контекст приложения XML:

<beans xmlns="http://www.springframework.org/schema/beans"
...
>

<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

<util:properties id="webLogicInitialContext">
    <prop key="java.naming.factory.initial">weblogic.jndi.WLInitialContextFactory</prop>
    <prop key="java.naming.provider.url">t3://localhost:7001</prop>
    <prop key="java.naming.security.principal">admin</prop>
    <prop key="java.naming.security.credentials">password</prop>
</util:properties>

<jee:jndi-lookup id="responseProxyConnectionFactory"
    jndi-name="jms/ConnectionFactory" environment-ref="webLogicInitialContext"/>

<bean id="responseProxyJmsTemplate" class="org.springframework.jms.core.JmsTemplate">
    <property name="connectionFactory"
        ref="responseProxyConnectionFactory" />
</bean>
</beans>

Это один из методов класса Java:

public class Order {
public void addOrder(OrderRequest addOrderRequest) {
    PurchaseOrder newOrder = orderHelper.createOrder(addOrderRequest);
    orderDaoHibernate.addOrder(newOrder);
    responseProxy.send(newOrder);

}
}

Мой тест:

@RunWith(SpringJUnit4ClassRunner.class)
@TestExecutionListeners( {TransactionalTestExecutionListener.class, DependencyInjectionTestExecutionListener.class,DirtiesContextTestExecutionListener.class })
@ContextConfiguration(locations={"/test-application-context.xml"})
@TransactionConfiguration(defaultRollback=true) 

public class TestOrder {

@Test
@Transactional
public void testMyOrder(){
Order ord = new Order();
OrderRequest req = new OrderRequest();
....
ord.addOrder(req);
}

}

Если я запускаю этот тест, среда Spring пытается загрузить WeblogicInitialContext, и если локальный weblogic не запускается, он выдает исключения.

Я не хочу отправлять сообщения JMS при вызове этого метода из Junit. Как я могу создать фиктивный WeblogicInitialContext.

Пожалуйста, помогите.

Некоторая часть исключения;

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean     with name 'responseProxyConnectionFactory': Invocation of init method failed; nested exception is javax.naming.CommunicationException [Root exception is java.net.ConnectException: t3://localhost:7001: Destination unreachable; nested exception is: 

Ответы [ 2 ]

2 голосов
/ 12 апреля 2011

Один из способов решения этой проблемы заключается в следующем:

Разделите конфигурацию вашего приложения на две части,

  • основная часть - где ваши обычные классы определены, внедрены, отсканированы, ...
  • зависимая от сервера часть (содержащая все, что не может быть создано в тесте)

Добавьте весенний конфиг, который импортирует их оба, и используйте его при запуске приложения.

Так что для тестирования вы можете использовать конфигурацию core-part. Если эту конфигурацию нельзя создать из-за того, что некоторые компоненты (образующие зависимую от сервера часть) отсутствуют, вам нужно их высмеять. Здесь у вас есть два варианта:

  • создать конфигурацию тестового макета, которая имитирует зависимую от сервера деталь с помощью макетов.
  • Вы можете попытаться добавить макеты программно в контекст приложения, прежде чем загружать основную часть. (гораздо сложнее)

В любом случае: я настоятельно рекомендую переосмыслить способ построения тестов. Может быть, лучше построить некоторые (не все) тесты полностью без пружины и создать тестируемый класс вручную (new) ) и «вводить» объекты, необходимые для теста, вручную. Объекты, которые не нужны для теста (вообще, или потому что делают тест только более трудным, но не лучше), должны быть заменены на Моксы.


Для создания макетов, я предпочитаю фальш-макет jMock . Я реализовал вспомогательный класс с методом Factory, который создает класс, а также создает и внедряет Mocks для всех полей, помеченных @ Autorwird / @ Ressourse.

0 голосов
/ 12 апреля 2011

Если бы это был общий контекст, которым вы делитесь с вашим производственным приложением, я бы сказал, что можно избежать создания экземпляров базы данных и JMS, переместив связанные компоненты JMS в другой контекст, который загружается только вашим основным приложением и не тестовый код.

Но так как это выделенный тестовый контекст, вы, вероятно, можете просто удалить те ненужные компоненты, такие как weblogic config и bend bean-компонент поиска контекста. Если вам все еще нужна очередь jms для повторного тестирования, вы можете использовать макет, как описано в этом вопросе SO .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...