Вопрос:

Код модульного тестирования, отправляющий сообщения JMS

java unit-testing spring jms jmstemplate

21603 просмотра

5 ответа

747 Репутация автора

У меня есть класс, который после того, как он делает некоторые вещи, отправляет сообщение JMS. Я хотел бы протестировать «материал», но не обязательно отправку сообщения.

Когда я запускаю свой тест, «заполняются» зелеными полосами, но затем не удается при отправке сообщения (должно быть, сервер приложений не работает). Каков наилучший способ сделать это - это смоделировать очередь сообщений, если это так, как это сделать.

Я использую Spring, и «jmsTemplate» вводится вместе с «queue».

Автор: bmw0128 Источник Размещён: 02.12.2008 10:01

Ответы (5)


6 плюса

1353 Репутация автора

Вы можете ввести поддельный jmsTemplate.

Предполагая, что easymock, что-то вроде

JmsTemplate mockTemplate = createMock(JmsTemplate.class)

Это бы сработало.

Автор: tunaranch Размещён: 02.12.2008 10:09

8 плюса

18482 Репутация автора

Решение

Самый простой ответ, который я бы использовал, - это отключить функцию отправки сообщений. Например, если у вас есть это:

public class SomeClass {
    public void doit() {
        //do some stuff
        sendMessage( /*some parameters*/);
    }

    public void sendMessage( /*some parameters*/ ) { 
        //jms stuff
    }
}

Затем я написал бы тест, который затемняет поведение sendMessage. Например:

@Test
public void testRealWorkWithoutSendingMessage() {
    SomeClass thing = new SomeClass() {
        @Override
        public void sendMessage( /*some parameters*/ ) { /*do nothing*/ }
    }

    thing.doit();
    assertThat( "Good stuff happened", x, is( y ) );
}

Если объем кода, который заглушается или скрывается, значителен, я бы не использовал анонимный внутренний класс, а просто «нормальный» внутренний класс.

Автор: Alex B Размещён: 02.12.2008 10:10

1 плюс

254002 Репутация автора

Другой вариант - MockRunner, который предоставляет фиктивные среды для JDBC, JMS, JSP, JCA и EJB. Это позволяет вам определять очереди / темы так же, как в «реальном» случае, и просто отправлять сообщение.

Автор: Aaron Digulla Размещён: 03.12.2008 08:56

0 плюса

6069 Репутация автора

Относительно того, как организовать все эти тестовые заглушки / макеты в более крупном приложении ...

Мы создаем и поддерживаем более крупное корпоративное приложение, которое настроено с помощью Spring. Настоящее приложение работает как EAR на сервере приложений JBoss. Мы определили наш контекст Spring с помощью beanRefFactory.xml

<bean id="TheMegaContext"
          class="org.springframework.context.support.ClassPathXmlApplicationContext">
    <constructor-arg>
        <list>
            <value>BasicServices.xml</value>
            <value>DataAccessBeans.xml</value>
            <value>LoginBeans.xml</value>
            <value>BussinessServices.xml</value>
            ....
        </list>
    </constructor-arg>
</bean>

Для запуска модульных тестов мы просто используем другой файл beanRefFactory.xml, который обменивает BasicServices на использование тестовой версии. В этой тестовой версии мы можем определять bean-компоненты с теми же именами, что и в рабочей версии, но с макетом / заглушкой или любой другой реализацией (например, база данных использует локальный источник данных Apache DPCP, а в рабочей версии используется источник данных из Appserver). ).

Автор: Ichthyo Размещён: 30.11.2010 03:34

0 плюса

534 Репутация автора

Это идеальный кандидат для использования модульного тестирования jMock, поскольку ваш сервер не работает, но вы должны использовать jMock для имитации взаимодействия с сервером.

Автор: Kumar Manish Размещён: 17.01.2012 07:22
Вопросы из категории :
32x32