Nous utilisons SoapUI pour simuler des services web afin de tester notre application (APP) avant d'avoir accès aux vrais services web.
La création d'un service fantaisie synchrone qui retournera une réponse prédéfinie est simple. Cependant, je dois simuler des asynchrone où l'APP envoie une requête, le SoapUI répond immédiatement avec une confirmation (par exemple SUCCESS) et ensuite après un intervalle prédéfini le SoapUI rappellera notre application (l'APP agit alors comme un serveur). J'ai réussi à le faire en utilisant un scénario de test où la première étape est MockResponse, puis le délai et enfin MockRequest (pour appeler notre application).
Ce qui précède fonctionne bien mais j'aimerais le faire en le scriptant directement dans la réponse Mock pour éviter d'utiliser des cas de test. J'ai réussi à écrire le script qui, lorsqu'un Mock Service reçoit une demande, déclenche le callback.
def project = result.mockOperation.mockService.project
// The API documentation doesn't say what finish is supposed to do but I try (doesn't help)
result.finish()
// Request that will be returned back - THE CALLBACK
def request = project.interfaces["LocationServicesOperation"].operations["ackLocation"].getRequestByName("Request 1")
sleep(4000)
request.submit(new com.eviware.soapui.impl.wsdl.WsdlSubmitContext( ), false)
Le problème avec la méthode ci-dessus est qu'elle déclenche le rappel AVANT d'envoyer la réponse à la demande initiale. J'ai essayé d'utiliser le traitement des événements dans SoapUI PRO mais je n'arrive pas à le faire fonctionner. Dans Wireshark, je peux voir la communication comme ceci :
1) APP request -> SoapUI
2) SoapUI callback -> APP
3) APP confirms 2) -> SoapUI
4) SoapUI confirms 1) -> APP
Cependant, elle doit l'être :
1) APP request -> SoapUI
2) SoapUI confirms 1) -> APP
3) SoapUI callback -> APP
4) APP confirms 2) -> SoapUI
Le code ci-dessus est en fait issu de l'événement MockRunListener.onMockResult dans SoapUI Pro. le result.finish()
ne fait pas l'affaire.
Merci pour tous les conseils !