2016-12-01 5 views
0

Я пишу тест, который использует некоторую логику на стороне клиента и некоторую логику на стороне сервера. На стороне клиента я делаю вызов REST для некоторого веб-сервиса, который управляет данными и сохраняет их в очереди JMS. Позднее я создал JMS-вызов, чтобы узнать, что было написано в JMS-теме, и получаю неожиданные результаты.Несколько потоков в Arquillain

Вот интересная часть тестового кода, который определяет этот вопрос:

@Test 
@OperateOnDeployment("my-deployable") 
public void testMessageInTopic() throws Exception { 
    // make a rest call with the minimal request 
    makeRequest(getMyXmlAsString()); 

    // compare the message with the one sent to the topic 
    connection = factory.createConnection(); 
    final Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 
    final MessageConsumer consumer = session.createConsumer(topic); 
    connection.start(); 

    System.out.println("### listening for a response"); 
    final TextMessage receivedMessage = (TextMessage) consumer.receive(); 
    final String expectedString = "sampleFromTest" 

    final String receivedText = receivedMessage.getText(); 
    System.out.println("### got this message " + receivedText); 
    assertEquals("the message in the received topic is the same", expectedString, receivedText); 
    System.out.println("#### the message was as expected"); 
} 

Метод makeRequest (окончательные данные строк) выполняет следующие действия:

public makeRequest(final String data) { 
    final String url = getAppEndpoint("http://localhost:8080/doit"); 
    final ClientRequest req= new ClientRequest(url); 
    req.header(HttpHeaderNames.CONTENT_TYPE, MediaType.TEXT_PLAIN); 
    req.body(MediaType.TEXT_PLAIN, data); 
    response = req.post(MyResponse.class); 
} 

При наблюдении бревен, здесь являются сообщениями, которые я получаю в порядке:

09:38:59,448 INFO [stdout] (pool-2-thread-1) ### got this message sampleFromTest 
09:38:59,448 INFO [stdout] (pool-2-thread-1) #### the message was as expected 
09:38:59,488 INFO [stdout] (pool-2-thread-2) ### listening for a response 

Очевидно, что встроенные тесты и совместные тесты на стороне клиента не играют хорошо, поскольку потоки становятся проблемой. Я могу потенциально обойти эту проблему, сделав вызов остальным в моем методе @Before, или, введя веб-сервис и программно нажав на него с запросом. Однако, поскольку мой интерес заключается в тестировании полного пути интеграции, смешение запросов клиентов и серверов кажется хорошей идеей. Мой вопрос заключается в том, можно ли запустить сценарий, когда мы делаем запрос на стороне клиента и анализируем данные, полученные контейнером?

ответ

0

Оказывается, я получал это несоответствие, потому что я вызывал метод jms receive() без добавления явного ожидания. Таким образом, выше выход был прав:

09:38:59,448 INFO [stdout] (pool-2-thread-1) ### got this message sampleFromTest 
09:38:59,448 INFO [stdout] (pool-2-thread-1) #### the message was as expected 
09:38:59,488 INFO [stdout] (pool-2-thread-2) ### listening for a response 

Чтобы решить мою проблему, я сделал что-то вроде этого, чтобы добавить явное, синхронное ожидание перед выполнением больше коды:

final TextMessage message = (TextMessage) consumer.receive(15000); 

Таким образом, после сообщения написано, я жду до 15 секунд, чтобы он просочился обратно. Хотя я никогда не мог доказать, что

### listening for a response 

никогда не происходило до

09:38:59,448 

в первоначальном вопросе, применяя этот подход действительно решает эту проблему.