2012-02-15 25 views
7

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

cevap

3
SOAPMessageContext context = 
      mock(SOAPMessageContext.class, RETURNS_DEEP_STUBS); 
    when(context.getMessage().getSOAPPart().getEnvelope(). 
      getHeader().getElementsByTagName(anyString())). 
      then(...); 

da Mockito belgelerinde derin koçanları kullanımıyla ilgili notlara dikkat ediniz. http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html#RETURNS_DEEP_STUBS

Ek açıklama stili: Böyle

@Mock(answer = Answers.RETURNS_DEEP_STUBS) SOAPMessageContext context; 
+0

Teşekkürler. Tam da aradığım şey. –

+0

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. –

+1

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

0

yapmayın sahte şeyler.

Kodu dinleyin, bunun doğru bir yol olmadığını söyleyin.

Bunun yerine, bazı bilinen verileri içeren (gerçek) bir ileti oluşturun ve kodunuzun onunla doğru şeyi yaptığını iddia edin.

örn.

MessageIdExtractor extractor = new MessageIdExtractor(); // < - sınıfı test ediyoruz

Dize beklenenMessageId = "xxxxxx";

İleti m = yeni SOAPMessage() .setMessageId (expectedMessageId);

assertThat (extractor.extractIdFrom (m), equalTo (expectedMessageId));

+2

Elbette - SOAPMessage'ı oluşturmak o kadar kolay değil ve sonuç olarak, bunun yerine sahte bir nesne kullanarak bunu yapmanın bir yolunu arıyordu. –

1

Burada biraz geç kaldım, ama bir mockito alayını proksiye eden çalışan bir Bitiş Noktası yumurtlamayı tercih ediyorum. Bu, kullanım durumunuz için yararlı olması gereken engelleyicileri ve/veya işleyicileri de içeren tüm yığını test etmeme izin verir.

Bazı şeyleri here basitleştiren basit bir JUnit Kuralı hazırlıyorum. Ortaya çıkan test vakaları küçük ve temiz olmalıdır. Sınama XML yanıtlarını doğrudan XML dosyalarından yüklemenizi öneririm, çünkü bu daha hızlı ve bakımı daha basittir.

İlgili konular