2016-11-04 6 views
0

私は非同期テストシナリオを持っています。私は自分のSUT(System Under Test)を呼び出し、応答応答を返します。次に、適切な応答が非同期的に返されます。私は以下のようにコールバック応答を受信するように指定された私のモックサーバを設定:Citrus Framework async HTTPテストシナリオ

<citrus-http:server id="receiveCallbackMockService" 
     port="${server.port}" 
     auto-start="true" 
     timeout="10000" 
     endpoint-adapter="dispatchingEndpointAdapter" /> 

<citrus:dispatching-endpoint-adapter id="dispatchingEndpointAdapter" 
     mapping-key-extractor="mappingKeyExtractor" 
     mapping-strategy="mappingStrategy"/> 


<bean id="mappingKeyExtractor" class="com.consol.citrus.endpoint.adapter.mapping.HeaderMappingKeyExtractor"> 
    <property name="headerName" value="#{T(com.consol.citrus.http.message.HttpMessageHeaders).HTTP_REQUEST_URI}"/> 
</bean> 

<bean id="mappingStrategy" 
    class="com.consol.citrus.endpoint.adapter.mapping.SimpleMappingStrategy"> 
    <property name="adapterMappings"> 
     <map> 
      <entry key="/callback" value-ref="responseAdapter"/> 
     </map> 
    </property> 
</bean> 

<citrus:static-response-adapter id="responseAdapter"> 
</citrus:static-response-adapter> 

その後、私は

receive(receiveCallbackMockService) 
    .payload(new ClassPathResource("/async/callbackExpectedRequest01.xml")); 

コールバックに予想されるペイロードを受けるべきであるのJava DSLのコードを使用しますが、実行するとき、私は、このような例外を取得しますテスト:

14:25:43,516 ERROR  citrus.Citrus| TEST FAILED HELLO_ASYNC_01: output 039 <com.mycompany.myproject> Nested exception is: 
com.consol.citrus.exceptions.CitrusRuntimeException: Unable to create endpoint for static endpoint adapter type 'class com.consol.citrus.endpoint.adapter.RequestDispatchingEndpoint 
Adapter' 
     at com.consol.citrus.endpoint.adapter.StaticEndpointAdapter.getEndpoint(StaticEndpointAdapter.java:35) 
     at com.consol.citrus.server.AbstractServer.createConsumer(AbstractServer.java:200) 
     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.dsl.actions.DelegatingTestAction.doExecute(DelegatingTestAction.java:54) 
     at com.consol.citrus.actions.AbstractTestAction.execute(AbstractTestAction.java:42) 
     at com.consol.citrus.TestCase.executeAction(TestCase.java:214) 
     at com.consol.citrus.TestCase.doExecute(TestCase.java:142) 
     at com.consol.citrus.actions.AbstractTestAction.execute(AbstractTestAction.java:42) 
     at com.consol.citrus.Citrus.run(Citrus.java:254) 
     at com.consol.citrus.dsl.testng.TestNGCitrusTest.invokeTestMethod(TestNGCitrusTest.java:124) 
     at com.consol.citrus.dsl.testng.TestNGCitrusTestDesigner.invokeTestMethod(TestNGCitrusTestDesigner.java:73) 
     at com.consol.citrus.dsl.testng.TestNGCitrusTest.run(TestNGCitrusTest.java:100) 
     at com.consol.citrus.dsl.testng.TestNGCitrusTest.run(TestNGCitrusTest.java:58) 
     at org.testng.internal.MethodInvocationHelper.invokeHookable(MethodInvocationHelper.java:209) 
     at org.testng.internal.Invoker.invokeMethod(Invoker.java:639) 
     at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:820) 
     at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1128) 
     at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:129) 
     at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:112) 
     at org.testng.TestRunner.privateRun(TestRunner.java:782) 
     at org.testng.TestRunner.run(TestRunner.java:632) 
     at org.testng.SuiteRunner.runTest(SuiteRunner.java:366) 
     at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:361) 
     at org.testng.SuiteRunner.privateRun(SuiteRunner.java:319) 
     at org.testng.SuiteRunner.run(SuiteRunner.java:268) 
     at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52) 
     at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86) 
     at org.testng.TestNG.runSuitesSequentially(TestNG.java:1244) 
     at org.testng.TestNG.runSuitesLocally(TestNG.java:1169) 
     at org.testng.TestNG.run(TestNG.java:1064) 
     at org.apache.maven.surefire.testng.TestNGExecutor.run(TestNGExecutor.java:132) 
     at org.apache.maven.surefire.testng.TestNGDirectoryTestSuite.executeMulti(TestNGDirectoryTestSuite.java:224) 
     at org.apache.maven.surefire.testng.TestNGDirectoryTestSuite.execute(TestNGDirectoryTestSuite.java:113) 
     at org.apache.maven.surefire.testng.TestNGProvider.invoke(TestNGProvider.java:146) 
     at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:286) 
     at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:240) 
     at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:121) 

私はシトラスHTTPモックServerが非同期テストscenariにコールバック要求を受信する(と予想される要求ペイロードでそれを検証する)ために設定する必要がありますどのようにo?

答えて

0

私の解決策を分かち合う時間がありました。まず、「受信したリクエストを待って、あらかじめ定義されたレスポンスメッセージを送信するスタンドアロンのシミュレータが必要です。これは、テストフレームワークとしてのCitrusの主な焦点ではありません」とポスト(http://citrus.895196.n3.nabble.com/Citrus-to-act-as-a-mock-server-td4023066.html)があります。 。

Springコンテキスト:

<bean id="globalVariables" class="com.consol.citrus.variables.GlobalVariables"></bean> 

Javaコード:

@Autowired 
private GlobalVariables globalVariables 
非同期リクエストがSUTから到着した、

1)を告げフラグとしてグローバル変数を使用します。しかし、私は、回避策を見つけました

とSUT非同期コールバック要求を待機する前に、変数(フラグ)を設定します。

globalVariables.getVariables().put("SUTcallbackStatus", "waiting"); 

2)IteratingConditionExpression延び - 以下のようにevaluate方法オーバーライド:コード上から

@Override 
public boolean evaluate(int index, TestContext context) { 

    if(index > threshold){ 
     testToFail.fail("The async message didn't arrived to the mock server."); 
     return false; 
    } 

    if(globalVariables.getVariables().get("SUTcallbackStatus").equals("received")){ 
     return false; 
    } 

    return true; 
} 

testToFailthreshold変数がテストクラスから設定されるべきである:

myIteratingConditionExpression.setThreshold(50); 
myIteratingConditionExpression.setTestToFail(this); 

それにあなたを可能にしますテストが応答を待つ時間を制御し(threshold * 0.5秒)、コールバック応答を受信しなかった場合に失敗するはずのテストを指すことができますseと仮定している。あなたのテストクラスで、その後

<citrus-http:server id="asyncResponseMockService" 
    port="${server.callback.port}" 
    auto-start="true" 
    timeout="10000" 
    endpoint-adapter="myResponseAdapter" /> 

4) - を待って起動する:メソッド

@Override 
public Message handleMessageInternal(Message message) { 

    globalVariables.getVariables().put("SUTcallbackStatus", "received"); 
    return super.handleMessageInternal(message); 
} 

以下オーバーライドし、あなたのモックサービスアダプタとしてこのアダプタを使用する -

3)StaticResponseEndpointAdapterを拡張非同期コールバックリクエスト - カスタムイテレーション条件付きのiterateアクションを使用してください:

これは私のために仕事をする:)

0

Citrusサーバーコンポーネントで静的応答アダプターとreceive()操作を同時に使用しています。これは動作していません。スタティック・レスポンス・アダプターは常にジャンプ・インし、テストでの受信操作は決して要求を受けません。

テストケースでそのサーバーコンポーネントからの要求を受信する場合は、静的応答アダプターと組み合わせてディスパッチ応答アダプターを削除してください。

+0

ありがとうございます。そこで、citrus-context.xmlの 'citrus-http:server id =" receiveCallbackMockService "から' endpoint-adapter = "dispatchingEndpointAdapter"を削除しましたが、今はそのような例外があります: 'com.consol.citrus.exceptions。 ActionTimeoutException: 'receiveCallbackMockService.inbound'チャネルからメッセージを受信中にアクションタイムアウトが発生しました。見栄えは良くなりますが、それほど良くありません:)私はかなり確信しています、そのサーバーは応答します。 – supertramp

関連する問題