Wie zu verwenden Mockito testen von SOAP-Nachrichten?
Ich bin Recht neu auf Mockito, und dachte, ich würde versuchen, es zu testen, eine SOAP-Handler. Dies ist jedoch entpuppt sich ein viel schmerzhafter als ich es mir erwartet/gewünscht.
Ich bin auf der Suche um zu überprüfen, dass meine hf ist in der Lage, extrahieren Sie die Nachrichten-id im header einer SOAPMessage. Aber von dem handler, der einzige Weg, um die Kopfzeile ist über das Kontext - /Meldung/Artikel/envelope/header. Mit Mockito meine Lösung war, zu verspotten, meine SOAPMessage, bedeutete die Schaffung jedes einzelne Objekt, und die Methode stubbing.
Ich kann mir nur vorstellen, dass es eine einfachere/bessere Möglichkeit, dies zu erreichen:
@RunWith(MockitoJUnitRunner.class)
public class UUIDHandlerTest {
@Mock private SOAPMessage message;
@Mock private SOAPEnvelope envelope;
@Mock private SOAPHeader header;
@Mock private SOAPPart part;
@Mock
private SOAPMessageContext context;
@Before
public void setup() throws SOAPException{
when( context.getMessage()).thenReturn(message);
when( message.getSOAPPart()).thenReturn(part);
when( part.getEnvelope()).thenReturn(envelope);
when( envelope.getHeader()).thenReturn(header);
}
@Test
public void testHandleInboundMessage() {
when( context.get(SOAPMessageContext.MESSAGE_OUTBOUND_PROPERTY)).thenReturn(false);
when(header.getElementsByTagName(anyString())).thenAnswer(new Answer<NodeList>() {
/* (non-Javadoc)
* @see org.mockito.stubbing.Answer#answer(org.mockito.invocation.InvocationOnMock)
*/
@Override
public NodeList answer(InvocationOnMock invocation) throws Throwable {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(new ByteArrayInputStream(new String("<wsa:MessageID>messageId</wsa:MessageID>").getBytes()));
//TODO Auto-generated method stub
return doc.getElementsByTagName("wsa:MessageID");
}
});
//call the test class
new UUIDHandler().handleMessage(context);
//check the MDC value
assertEquals("messageId", MDC.get(LoggerConstants.DC_PROPERTY_MESSAGE_ID));
}
}
Wie gesagt, es funktioniert, aber es sieht aus wie eine sehr hässliche/Dicke Gewicht Lösung.
Gibt es trotzdem, dies zu tun einfacher/sauberer?
Dank!
Eric
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bitte achten Sie auch auf die Hinweise zur Nutzung der tiefen stubs in die mockito-Dokumentation.
http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html#RETURNS_DEEP_STUBS
Annotation Stil:
Ein bisschen spät hier, aber ich bevorzuge laichen eine funktionierende Endpunkt die proxies eine mock, mockito. Dies ermöglicht mir testen Sie den ganzen Stapel, darunter Abfangjäger und/oder Behandler, die hilfreich für Ihren Anwendungsfall.
Habe ich einen einfachen JUnit-Regel, die vereinfacht die Sache etwas hier. Die daraus resultierende test-Fällen sollten kleine und sauber. Ich empfehle laden von XML-test-Antworten direkt aus XML-Dateien, denn das ist schneller und einfacher zu pflegen.
Verspotten Sie nicht Dinge wie diese.
Lauschen Sie den code... das sagen Sie, dass dies nicht der richtige Weg, es zu tun.
Eher, erstellen Sie einfach eine (echte) Meldung, dass einige Daten bekannt sind, und behaupten, dass dein code nicht das Recht Sachen mit ihm.
z.B.
MessageIdExtractor extractor = new MessageIdExtractor(); //<- Klasse, die Sie testen
String expectedMessageId = "xxxxxx";
Message m = new SOAPMessage( ).setMessageId(expectedMessageId);
assertThat(Extraktor.extractIdFrom(m), equalTo(expectedMessageId));