Search code examples
rest-clientcitrus-framework

Citrus rest client-server test fail with mvn clean verify


[enter image description here][1]I have created the following citrus test cases to test a basic connection between Rest client and server:

    @Test
    @CitrusTest
    fun httpActionTest() {

        variable("username", "user")
        variable("password","password")
        http().client("httpClient")
                .send()
                .post("/api/authenticate")
                .messageType(MessageType.JSON)
                .contentType("application/json")
                .payload("{ \"username\": \"\${username}\", \"password\": \"\${password}\"}");

        http().client("httpClient")
                .receive()
                .response(HttpStatus.OK)
                .validate("$.token","asasasasas")
    }

    @CitrusTest
    fun httpServerActionTest() {
        http().server("httpServer")
                .receive()
                .post("/api/authenticate")
                .payload("{ \"username\": \"\${username}\", \"password\": \"\${password}\"}")
                .contentType("application/json")
                .accept("application/json")
                .extractFromPayload("username", "username")
                .extractFromPayload("password", "password")
                .validate("$.username", "user")
                .validate("$.password","pass")
    http().server("httpServer")
            .send()
            .response(HttpStatus.OK)
            .payload("{\"token\": \"lsdkfjkh8sdfg98zsd\"}")
            .version("HTTP/1.1")
            .contentType("application/json")
}

I have defined the server and client endpoints in citrux-context.xml as follows:

<citrus-http:client id="httpClient"
                    request-url="http://localhost:8080"
                    request-method="GET"
                    content-type="application/json"
                    charset="UTF-8"
                    timeout="60000"/>
<citrus-http:server id="httpServer"
                    port="8080"
                    auto-start="true"
                    resource-base="src/test/resources"/>

While executing via IntelliJ, following logs are observed:

    INFO: Loading XML bean definitions from URL [file:/home/jass/intersales/jk-magento/magento2-auth-service/target/test-classes/citrus-context.xml]
    [main] INFO org.eclipse.jetty.util.log - Logging initialized @9851ms to org.eclipse.jetty.util.log.Slf4jLog
    [main] INFO org.eclipse.jetty.server.Server - jetty-9.4.6.v20170531
    [main] INFO org.eclipse.jetty.server.handler.ContextHandler.ROOT - Initializing Spring FrameworkServlet 'httpServer-servlet'
    Oct 23, 2017 8:49:45 AM com.consol.citrus.http.servlet.CitrusDispatcherServlet initServletBean
    INFO: FrameworkServlet 'httpServer-servlet': initialization started
    Oct 23, 2017 8:49:45 AM org.springframework.web.context.support.XmlWebApplicationContext prepareRefresh
    INFO: Refreshing WebApplicationContext for namespace 'httpServer-servlet-servlet': startup date [Mon Oct 23 08:49:45 CEST 2017]; root of context hierarchy
    Oct 23, 2017 8:49:45 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
    INFO: Loading XML bean definitions from class path resource [com/consol/citrus/http/citrus-servlet-context.xml]
    Oct 23, 2017 8:49:46 AM org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping register
    ...
INFO: Looking for @ControllerAdvice: WebApplicationContext for namespace 'httpServer-servlet-servlet': startup date [Mon Oct 23 08:49:45 CEST 2017]; root of context hierarchy
    Oct 23, 2017 8:49:47 AM com.consol.citrus.http.servlet.CitrusDispatcherServlet initServletBean
    INFO: FrameworkServlet 'httpServer-servlet': initialization completed in 1570 ms
    [main] INFO org.eclipse.jetty.server.handler.ContextHandler - Started o.e.j.s.ServletContextHandler@1bb1fde8{/,file:///home/jass/intersales/jk-magento/magento2-auth-service/src/test/resources/,AVAILABLE}
    [main] INFO org.eclipse.jetty.server.AbstractConnector - Started ServerConnector@1286528d{HTTP/1.1,[http/1.1]}{0.0.0.0:8080}
    [main] INFO org.eclipse.jetty.server.Server - Started @12166ms
    [main] INFO com.consol.citrus.http.server.HttpServer - Started server: httpServer
    [main] INFO com.consol.citrus.Citrus - 
    [main] INFO com.consol.citrus.Citrus - ------------------------------------------------------------------------
    [main] INFO com.consol.citrus.Citrus -        .__  __                       
    [main] INFO com.consol.citrus.Citrus -   ____ |__|/  |________ __ __  ______
    [main] INFO com.consol.citrus.Citrus - _/ ___\|  \   __\_  __ \  |  \/  ___/
    [main] INFO com.consol.citrus.Citrus - \  \___|  ||  |  |  | \/  |  /\___ \ 
    [main] INFO com.consol.citrus.Citrus -  \___  >__||__|  |__|  |____//____  >
    [main] INFO com.consol.citrus.Citrus -      \/                           \/
    [main] INFO com.consol.citrus.Citrus - 
    [main] INFO com.consol.citrus.Citrus - C I T R U S  T E S T S  2.7.2
    [main] INFO com.consol.citrus.Citrus - 
    [main] INFO com.consol.citrus.Citrus - ------------------------------------------------------------------------
    [main] INFO com.consol.citrus.Citrus - 
    [main] INFO com.consol.citrus.Citrus - 

    [main] INFO com.consol.citrus.Citrus - BEFORE TEST SUITE: SUCCESS
    [main] INFO com.consol.citrus.Citrus - ------------------------------------------------------------------------
    [main] INFO com.consol.citrus.Citrus - 
    [main] INFO com.consol.citrus.actions.EchoAction - Today is: 23.10.2017
    [main] INFO com.consol.citrus.Citrus - 
    [main] INFO com.consol.citrus.Citrus - TEST SUCCESS VerticleCitrusTest.echoToday (de.intersales.qbus2)
    [main] INFO com.consol.citrus.Citrus - ------------------------------------------------------------------------
    [main] INFO com.consol.citrus.Citrus - 
    [qtp191568263-12] INFO com.consol.citrus.channel.ChannelSyncProducer - Message was sent to channel: 'httpServer.inbound'
    [qtp191568263-12] WARN com.consol.citrus.channel.ChannelEndpointAdapter - Reply timed out after 1000ms. Did not receive reply message on reply channel
    [main] INFO com.consol.citrus.http.client.HttpClient - HTTP message was sent to endpoint: 'http://localhost:8080/magento2/authenticate'

    [main] INFO com.consol.citrus.validation.xml.DomXmlMessageValidator - XML message validation successful: All values OK
    [main] INFO com.consol.citrus.validation.DefaultMessageHeaderValidator - Message header validation successful: All values OK

    [main] INFO com.consol.citrus.Citrus - 
    [main] INFO com.consol.citrus.Citrus - TEST SUCCESS VerticleCitrusTest.httpActionTest (de.intersales.qbus2)
    [main] INFO com.consol.citrus.Citrus - ------------------------------------------------------------------------
    [main] INFO com.consol.citrus.Citrus - 

    [main] INFO com.consol.citrus.Citrus - 
    [main] INFO com.consol.citrus.Citrus - ------------------------------------------------------------------------
    [main] INFO com.consol.citrus.Citrus - 
    [main] INFO com.consol.citrus.Citrus - 
    [main] INFO com.consol.citrus.Citrus - AFTER TEST SUITE: SUCCESS
    [main] INFO com.consol.citrus.Citrus - ------------------------------------------------------------------------
    [main] INFO com.consol.citrus.Citrus - 
    [main] INFO com.consol.citrus.Citrus - ------------------------------------------------------------------------
    [main] INFO com.consol.citrus.Citrus - 
    [main] INFO com.consol.citrus.Citrus - CITRUS TEST RESULTS
    [main] INFO com.consol.citrus.Citrus - 
    [main] INFO com.consol.citrus.Citrus -  VerticleCitrusTest.echoToday ................................... SUCCESS
    [main] INFO com.consol.citrus.Citrus -  VerticleCitrusTest.httpActionTest .............................. SUCCESS
    [main] INFO com.consol.citrus.Citrus - 
    [main] INFO com.consol.citrus.Citrus - TOTAL:   2
    [main] INFO com.consol.citrus.Citrus - FAILED:  0 (0.0%)
    [main] INFO com.consol.citrus.Citrus - SUCCESS: 2 (100.0%)
    [main] INFO com.consol.citrus.Citrus - 
    [main] INFO com.consol.citrus.Citrus - ------------------------------------------------------------------------
    [main] INFO com.consol.citrus.report.HtmlReporter - Generated HTML test report

But getting an error when executing via mvn clean verify with the following error:

    [main] ERROR com.consol.citrus.Citrus - TEST FAILED VerticleCitrusTest.httpActionTest <de.intersales.qbus2> Nested exception is: 
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'httpClient' available
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:687)
       ...

`

Any suggestions or help is greatly appreciated.

EDITED The following is my project structure [Placement of resources] [1]: https://i.sstatic.net/aVabX.png


Solution

  • I see multiple issues in your code and setup. First of all the httpServerActionTest() is missing the @Test annotation. If not put on class level this annotation needs to be repeated on each method in your test class.

    Secondly the complete test structure does not make much sense to me. In httpActionTest() test you send a client request to the server while in httpServerActionTest() you receive that very same request as a server and validate its contents with Citrus. Your test is both client and server at the same time. Feels wrong to me! In particular this test setup will never work as Http is a synchronous protocol by nature and httpActionTest() is not able to succeed without httpServerActionTest() performing. You will get timeout exceptions on client side then. This will only work in case both methods are executed in parallel to each other.

    Regarding the Maven failure: citrux-context.xml is misspelled (citrux vs. citrus). Also it seems to me that the file is not properly added to the Maven project as a resource. Did you keep the default Maven directory layout?

    Once again the complete test setup does not clarify its purpose to me.