2010-09-13 4 views
4

Je veux écrire un test unitaire pour un code qui génère un message SOAP avec une pièce jointe et l'envoie:Comment puis-je tester un code qui envoie une requête de service Web SOAP?

SOAPConnectionFactory factory = SOAPConnectionFactory.newInstance(); 
conn = factory.createConnection(); 
conn.call(message, endpoint); 

où l'usine est un javax.xml.soap.SOAPConnectionFactory

Je ne me soucie pas de réponse à venir de retour mais je veux être en mesure de vérifier le message qui est envoyé. Le code va être refactorisé et je veux m'assurer qu'il envoie les mêmes messages après comme avant.

Y at-il un cadre que je peux utiliser pour créer un point final fictif qui me permettra d'analyser la demande dans mon test? Si oui, un exemple de code serait très utile.

+0

quand vous dites « vérifier le message qui est envoyé » vous cherchez vraiment être sûr qu'une demande est sur le fil à un service à distance ou tout simplement que le « conn.call (message, point final) » méthode a été appelée? –

+0

@Angelo Je veux analyser le message résultant que l'appel à conn.call envoie. Examiner le contenu de celui-ci et faire des affirmations à ce sujet dans le test. Nous utilisons peut-être une autre méthode/bibliothèque à envoyer dans le futur. – Alb

+0

Essayez ceci: https://github.com/skjolber/mockito-soap-cxf – ThomasRS

Répondre

4

Il existe un projet java.net appelé WSUnit qui devrait vous aider. Il s'agit essentiellement d'une servlet d'écoute qui écoute les messages. Vous pouvez lui envoyer des messages et vérifier le contenu du message à l'aide de XMLUnit.

+0

Cela ressemble à ce que je veux, je vais vérifier et rapporter ici. – Alb

+0

Merci, j'ai ajouté ma propre réponse et expliqué pourquoi je suis allé avec jetty à la place pour mon cas particulier. – Alb

+1

WSUnit lien est mort – MartinL

2

Utilisez JMock. JMock vous permet de tester le comportement plutôt que les changements d'état. Pour ce faire, vous aurez besoin de résumer la méthode SOAPCOnnectionFactory.newInstance() dans un objet diffent:

public class MySOAPConnectionFactory { 

    public SOAPConnectionFactory getConnection() { 
     return SOAPConnectionFactory.newInstance(); 
} 

Utilisez un objet de la nouvelle classe dans votre code. Ensuite, dans votre test, remplacez l'objet Factory par un objet Mock, ce qui renvoie une connexion Mock. Définir les attentes sur la connexion Mock attend l'appel que vous recherchez.

final SOAPConnectionFactory mockConnection = mockery.mock(SOAPConnectionFactory.class); 
final SOAPConnection mockSoapConnection = mockery.mock(SOAPConnection.class); 
foo.setMySOAPConnectionFactory(mockConnectionFactory); 
try { 
     mockery.checking(new Expectations() { 

     { 
      atLeast(1).of(mockConnectionFactory).getConnection(); 
      will(returnValue(mockSoapConnection)); 
      atLeast(1).of(mockConnection).call(SOME_MESSAGE, ENDPOINT); 
     } 
     }); 
+0

Merci, mais je veux tester à un niveau différent de celui-ci, je veux la connexion réelle pour créer quelle demande HTTP SOAP, il enverra, puis je veux vérifier le contenu de cela. – Alb

+0

Ah. N'essayez-vous pas à ce stade de tester l'implémentation de SOAPConnection plutôt que votre code? –

+0

Je suis en train de tester ce que le code envoie réellement au service Web. Je veux m'assurer que si le code change, même la bibliothèque utilisée (axe) que la même requête est envoyée. Je sais idéalement que chaque classe devrait être testée à une granularité plus fine, mais le temps ne le permettra pas. – Alb