Mockito'ya oldukça yeniyim ve bir SOAP Handler'ı test etmek için kullanmaya çalışacağımı düşündüm. Ancak, bu beklediğim/istediğimden çok daha acı verici bir hal alıyor.SOAP mesajlarını test etmek için Mockito nasıl kullanılır?
İşleyicimin ileti kimliğini SOAPMessage üstbilgisinde ayırabildiğini doğrulamak istiyorum. Ancak, işleyiciden, başlığa ulaşmanın tek yolu bağlam/mesaj/bölüm/zarf/başlıktır. Mockito'yu kullanarak çözümüm, SOAPMessage'imi dalgalandırmaktı, her bir nesneyi oluşturmayı ve yöntemi yormaktı. Dediğim gibi çalıştığını,
@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));
}
}
, ama çok çirkin/ağır çözüm gibi görünüyor:
Ben sadece bunu sağlamanın kolay/temizleyici bir yol olduğunu tahmin edebilirsiniz.
Bunu daha kolay yapmak için daha temizleyici var mı?
Teşekkürler!
Eric
Teşekkürler. Tam da aradığım şey. –
Dokümanlara göre, RETURN_DEEP_STUBS kullanılarak mümkün olduğunca kaçınılmalıdır. Bu durumda, sanırım soru olur, bu tür bir testi yapmak için iyi bir metodoloji [email protected] time4tea, gerçek bir SOAPMessage yaratmanın daha mantıklı olduğunu gösteriyor gibi görünüyor, ancak Mocks kullanmaktaki tüm kavramım, sadece test için karmaşık bir yapı oluşturmaya gerek duymaktan kaçınmaktır. Herhangi bir tavsiye memnuniyetle karşılanacaktır. –
Cidden - bunu yapma. Anlamadığınız bir kodla sonuçlanacaksınız, bu çok kırılgan ve sadece kodunuzu değil, her şeyin uygulanmasını test ediyor. Gerçek bir SOAP isteği kullanmayı düşünün (eğer bir tane oluşturmak mümkün ise), ya da bilinen bir xml bitini döndüren bir sunucu oluşturmayı ve sınıfınızın doğru bilgi bittiğini kontrol etmeyi deneyin. – time4tea