Получение сообщений от tcp-сервера с фреймворком Citrus и временем ожидания Spring Integration

Я пытаюсь протестировать простую последовательность отправки/получения tcp с использованием цитрусовых фреймворков. Я могу отправлять сообщения нормально, но получение сообщений оказывается проблематичным. По сути, ответ не обнаруживается цитрусовыми, а затем время ожидания цитрусовых истекает.

Конфигурация цитрусовых бобов:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:citrus="http://www.citrusframework.org/schema/config"
   xmlns:int="http://www.springframework.org/schema/integration"
   xmlns:int-ip="http://www.springframework.org/schema/integration/ip"
   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd

    http://www.citrusframework.org/schema/config http://www.citrusframework.org/schema/config/citrus-config.xsd
    http://www.springframework.org/schema/integration  http://www.springframework.org/schema/integration/spring-integration.xsd
    http://www.springframework.org/schema/integration/ip  http://www.springframework.org/schema/integration/ip/spring-integration-ip.xsd">

<citrus:channel-endpoint id="citrusServiceInputEndpoint"
                         channel-name="input" />

<citrus:channel-endpoint id="citrusServiceRepliesEndpoint"
                         channel-name="replies" />

<int-ip:tcp-connection-factory id="client"
                               type="client" host="localhost" port="9123" single-use="false"
                               so-timeout="10000" using-nio="true" />

<int:channel id="input" />

<int:channel id="replies">
    <int:queue capacity="10" />
</int:channel>

<int-ip:tcp-outbound-channel-adapter
        id="outboundClient" channel="input" connection-factory="client" />

<int-ip:tcp-inbound-channel-adapter
        id="inboundClient" channel="replies" connection-factory="client" />

Citrus test case:

@Test
@CitrusTest(name = "sendSpringIntegrationMessageTest")
public void sendSpringIntegrationMessageTest() throws Exception {
    send("citrusServiceInputEndpoint").payload("Req");
    receive("citrusServiceRepliesEndpoint").payload("Rsp");
}

Я использую простой сервер netcat для тестирования:

nc -kl 9123

При запуске тестового примера текст «Req» отлично отображается на netcat. Однако при вводе «Rsp» в netcat данные не поступают на цитрусовый тест. Примерно через 5 секунд тестовый пример завершается с ошибкой со следующим сообщением:

com.consol.citrus.exceptions.TestCaseFailedException: Test case failed

at com.consol.citrus.TestCase.executeAction(TestCase.java:218)
at com.consol.citrus.TestCase.doExecute(TestCase.java:139)
at com.consol.citrus.actions.AbstractTestAction.execute(AbstractTestAction.java:42)
at com.consol.citrus.Citrus.run(Citrus.java:243)
at com.consol.citrus.dsl.junit.JUnit4CitrusTest.invokeTestMethod(JUnit4CitrusTest.java:90)
at com.consol.citrus.dsl.junit.JUnit4CitrusTestDesigner.invokeTestMethod(JUnit4CitrusTestDesigner.java:68)
at com.consol.citrus.dsl.junit.JUnit4CitrusTest.run(JUnit4CitrusTest.java:71)
at com.consol.citrus.junit.CitrusJUnit4Runner$InvokeRunMethod.evaluate(CitrusJUnit4Runner.java:212)
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:254)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:89)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:193)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:234)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:74)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
Caused by: com.consol.citrus.exceptions.ActionTimeoutException: Action timeout while receiving message from channel 'replies'
    at com.consol.citrus.channel.ChannelConsumer.receive(ChannelConsumer.java:97)
    at com.consol.citrus.messaging.AbstractSelectiveMessageConsumer.receive(AbstractSelectiveMessageConsumer.java:50)
    at com.consol.citrus.actions.ReceiveMessageAction.receive(ReceiveMessageAction.java:146)
    at com.consol.citrus.actions.ReceiveMessageAction.doExecute(ReceiveMessageAction.java:125)
    at com.consol.citrus.actions.AbstractTestAction.execute(AbstractTestAction.java:42)
    at com.consol.citrus.TestCase.executeAction(TestCase.java:211)
    ... 33 more

Так что в основном Citrus не получил ответа. Обратите внимание, что я должен определить очередь для канала ответов, поскольку это то, что ожидает Citrus, канал ответов должен реализовывать интерфейс PollableChannel.

Помогите, пожалуйста, понять, почему Цитрус не получает данные из очереди?


person mdewit    schedule 21.04.2016    source источник


Ответы (2)



Вот правильная конфигурация bean-компонента, чтобы этот тест работал. Добавлен сериализатор/десериализатор, предложенный Гэри.

Мне также пришлось добавить преобразователь сообщений (преобразователь объекта в строку), поскольку данные, предоставляемые Spring в канале ответов, будут иметь тип byte[]. Citrus ожидает проверки по типу String, поэтому необходимо преобразование для преобразования массива байтов в строку.

Надеюсь, это поможет кому-то в будущем!

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:citrus="http://www.citrusframework.org/schema/config"
   xmlns:int="http://www.springframework.org/schema/integration"
   xmlns:int-ip="http://www.springframework.org/schema/integration/ip"
   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd

http://www.citrusframework.org/schema/config http://www.citrusframework.org/schema/config/citrus-config.xsd
http://www.springframework.org/schema/integration  http://www.springframework.org/schema/integration/spring-integration.xsd
http://www.springframework.org/schema/integration/ip  http://www.springframework.org/schema/integration/ip/spring-integration-ip.xsd">

<citrus:channel-endpoint id="citrusServiceInputEndpoint"
                         channel-name="input" />

<citrus:channel-endpoint id="citrusServiceRepliesEndpoint"
                         channel-name="response" />

<int-ip:tcp-connection-factory id="client"
                               type="client" host="localhost" port="9123" single-use="false"
                               so-timeout="10000" using-nio="true" deserializer="javaSerializer"
                               serializer="javaSerializer" />

<bean id="javaSerializer"
      class="org.springframework.integration.ip.tcp.serializer.ByteArrayLfSerializer" />

<int:channel id="input" />

<int:channel id="replies">
</int:channel>

<int:channel id="response">
    <int:queue />
</int:channel>

<int:object-to-string-transformer id="transformer" input-channel="replies" output-channel="response" />

<int-ip:tcp-outbound-channel-adapter
        id="outboundClient" channel="input" connection-factory="client" />

<int-ip:tcp-inbound-channel-adapter
        id="inboundClient" channel="replies" connection-factory="client" />

person mdewit    schedule 22.04.2016