如何为 spring 集成 xml 代码编写单元测试

how to write unit test for spring integration xml code

我是 spring 集成的新手,我想为我的应用程序编写单元测试用例。我正在开发一个应用程序,其中集成接口将由具有 XML 输入的其他系统调用我们使用 XSLT 转换输入 XML 并将调用不同的系统并将响应发送到来电者。

<?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:int="http://www.springframework.org/schema/integration"
    xmlns:task="http://www.springframework.org/schema/task"
    xmlns:int-jms="http://www.springframework.org/schema/integration/jms"
    xmlns:int-http="http://www.springframework.org/schema/integration/http"
    xmlns:int-xml="http://www.springframework.org/schema/integration/xml"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.2.xsd
        http://www.springframework.org/schema/integration/xml http://www.springframework.org/schema/integration/xml/spring-integration-xml-4.2.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd
        http://www.springframework.org/schema/integration/jms http://www.springframework.org/schema/integration/jms/spring-integration-jms-4.2.xsd
        http://www.springframework.org/schema/integration/http http://www.springframework.org/schema/integration/http/spring-integration-http-4.2.xsd
        http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration-5.0.xsd">

        <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
             <property name="locations">
                <list>
                    <value>application.properties</value>
                    <value>application-${spring.profiles.active}.properties</value>
                </list>
             </property>
        </bean>

        <bean id="MessagePrinter" class="com.oms.integration.messagelogger.MessagePrinter"></bean>

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

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

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

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

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

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

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

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



        <int-http:inbound-gateway request-channel="logIncommingCaptureRequestChannel" supported-methods="POST" path="/fp075" reply-channel="ResponseFromCardinalToYantraChannel"/>

        <int-http:outbound-gateway request-channel="CaptureRequestToCardinalChannel" url="${Paypal_Url}={data}" expected-response-type="java.lang.String" http-method="GET" reply-channel="logCaptureResponseFromCardinal">
            <int-http:uri-variable name="data" expression="payload"/>
        </int-http:outbound-gateway>

        <int:service-activator ref="MessagePrinter" input-channel="logIncommingCaptureRequestChannel" method="printIncommingCaptureRequestFromYantra" output-channel="incommingCaptureRequestToCardinal"></int:service-activator> 


        <int:service-activator ref="MessagePrinter" input-channel="transformedCaptureRequestToCardinalChannel" method="printTransformedCaptureRequestFromYantraToCardinal" output-channel="CaptureRequestToCardinalChannel"></int:service-activator> 

         <int:service-activator ref="MessagePrinter" input-channel="logCaptureResponseFromCardinal" method="printCaptureResponseFromCardinal" output-channel="transformCaptureResponseFromCardinal"></int:service-activator>

        <int:service-activator ref="MessagePrinter" method="printTransformedResponseFromCardinal" input-channel="logTransformResponseFromCardinal" output-channel="ResponseFromCardinalToYantraChannel"></int:service-activator>


        <int-xml:xslt-transformer
        input-channel="incommingCaptureRequestToCardinal"
        xsl-resource="classpath:/templates/FP075/DSW_XSLT_YANTRA_To_Paypal_Capture_Request_FP075.xslt"
        output-channel="transformedCaptureRequestToCardinalChannel"
        id="TransformIncommingCaptureRequest">
        <int-xml:xslt-param name="MsgType"
            value="${PP_Cardinal_MsgType_FP075}" />
        <int-xml:xslt-param name="Version"
            value="${PP_Cardinal_Version}" />
        <int-xml:xslt-param name="ProcessorId"
            value="${PP_Cardinal_ProcessorId}" />
        <int-xml:xslt-param name="MerchantId"
            value="${PP_Cardinal_MerchantId}" />
        <int-xml:xslt-param name="TransactionPwd"
            value="${PP_Cardinal_TransactionPwd}" />
    </int-xml:xslt-transformer>
        <int-xml:xslt-transformer
        id="transformCaptureResponse"
        input-channel="transformCaptureResponseFromCardinal"
        xsl-resource="classpath:/templates/FP075/DSW_XSLT_YANTRA_To_Paypal_Capture_Response_FP075.xslt"
        output-channel="logTransformResponseFromCardinal">
    </int-xml:xslt-transformer>
</beans>

既然你有 <int-http:inbound-gateway><int-http:outbound-gateway> 我建议你看一下 Mock Spring MVC:https://docs.spring.io/spring/docs/current/spring-framework-reference/testing.html#spring-mvc-test-framework

服务器端可能是这样的:

@RunWith(SpringRunner.class)
@WebAppConfiguration
@DirtiesContext
public class MyTests {

    @Autowired
    private WebApplicationContext wac;

    private MockMvc mockMvc;

    @Before
    public void setup() {
        this.mockMvc =
                MockMvcBuilders.webAppContextSetup(this.wac)
                        .build();
    }

对于客户端,您需要使用 MockMvcClientHttpRequestFactory 之类的东西并将其注入 HttpRequestExecutingMessageHandler 中提到的 <int-http:outbound-gateway>

所以,最后你的主要配置是一样的,所有的流程结构都保持不变。您通过 this.mockMvc.perform() 发送模拟请求并期望在流程处理后得到响应。