2013-11-01 4 views
6

क्या यह सच है कि मॉकिटो उन वस्तुओं को नकल नहीं कर सकता जो पहले से ही CGLIB द्वारा बढ़ाए गए थे?मैकिंग CGLIB उन्नत ऑब्जेक्ट्स

public class Article { 

    @Autowired 
    private dbRequestHandler 

    @Autowired 
    private filesystemRequestHandler 

    @Transactional 
    public ArticleDTO getArticleContents() { 

     //extractText() and then save the data in DTO 
     //extractImages() and then save the data in DTO 
     // some other calls to other databases to save data in dto 

     return articleDTO; 

    } 
    public void extractText() { 

     //call to DB 

    } 

    public void extractImages() { 

     // call to file system 

    } 
} 


public class IntegrationTest { 

    @Autowired 
    private Article article; 

    //setup method { 

    articleMock = Mockito.spy(article); 

    doNothing().when(articleMock).extractImages(); 
} 
} 

ऊपर के उदाहरण में जब यह doNothing().when(articleMock).extractImages(); की बात आती है यह वास्तव में असली समारोह कहता है। एक नजदीक देखो लेख पर दो बार बढ़ाया जाता है। autowiring का एक कारण और spying का दूसरा कारण।

यदि मैं उन्नत वस्तुओं पर जासूसी नहीं कर सकता, तो मैं अपने इंटीग्रेशन टेस्ट में getArticle() विधि का परीक्षण कैसे कर सकता हूं, ताकि मैं एक उचित डीटीओ वापस लौटा सकूं।

नोट: मैं वास्तव में उस विधि का परीक्षण नहीं करना चाहता जो फाइल सिस्टम कॉल करता है। बस डीबी वाले। यही कारण है कि मुझे getArticle विधि का परीक्षण करने की आवश्यकता है।

+0

जो मैंने पाया [दस्तावेज] (http://docs.mockito.googlecode.com/hg/latest/org/mockito/Mockito.html#doNothing()) मैं अनुचित रूप से समस्या को नहीं देखता। क्या आपने इसे 'अनुच्छेद' स्वयं बनाकर कोशिश की है, और इसे स्वचालित नहीं किया गया है (या कम से कम स्वचालन के बाद शुद्धता को सत्यापित किया गया है)? – atomman

+0

हाँ यदि मैं स्वयं 'आलेख' बना देता हूं, तो मैं जासूसी करने में सक्षम हूं। लेकिन मुझे इसे स्वचालित करना है, क्योंकि मेरे आवेदन में प्रत्येक ऑब्जेक्ट ऑटोवॉयरिंग द्वारा बनाया गया है, और यदि मैं अपने द्वारा 'आलेख' शुरू करता हूं तो अनुच्छेद वर्ग में फ़ील्ड शून्य है (उदाहरण के लिए reqHandler ऑब्जेक्ट्स)। यदि मैं उन क्षेत्रों को भी शुरू करता हूं तो उन वर्गों के क्षेत्र शून्य हैं और श्रृंखला चालू होती है .. – samach

+0

फ़िल्टर कोड और आपका प्रश्न फिट नहीं है - 'getArticle() 'प्रश्न में,' getArticleContents()' कोड में - यह कुछ भ्रम पैदा कर रहा है। आपको कुछ और 'एकीकरण टेस्ट' कोड प्रदान करने पर विचार करना चाहिए। – Cebence

उत्तर

3

यदि मैं सही ढंग से समझता हूं कि आपकी कक्षा वसंत द्वारा वायर्ड है। स्प्रिंग केवल सीजीआईएलबी का उपयोग करता है ताकि लेनदेन संबंधी व्यवहार सुनिश्चित किया जा सके, यदि कोई इंटरफ़ेस नहीं है, जो आपके ऑब्जेक्ट द्वारा लागू किया गया है। यदि कोई इंटरफ़ेस है, तो यह सरल जेडीके डायनामिक प्रॉक्सी का उपयोग करता है। (http://docs.spring.io/spring/docs/3.0.0.M3/reference/html/ch08s06.html देखें)

शायद आप एक इंटरफ़ेस निकालने का प्रयास कर सकते हैं, और वसंत को गतिशील प्रॉक्सी का उपयोग करने दें। शायद तो मॉकिटो बेहतर प्रदर्शन कर सकता है।

1

यदि आप एक वास्तविक इकाई परीक्षण के रूप में चलते हैं और एकीकरण परीक्षण के रूप में नहीं, तो आपको अपने लिए स्प्रिंग ऑटोवायर वाले कंटेनर में भागने की आवश्यकता नहीं है। आपकी टिप्पणियों में से एक में, मुझे लगता है कि आपने इसे करने की कोशिश की है, और आपने ध्यान दिया कि जंजीर ऑब्जेक्ट संदर्भों का एक अंतहीन सेट था जिसे आपको भी प्रदान करना होगा। लेकिन इसके चारों ओर एक रास्ता है। मॉकिटो कुछ पूर्वनिर्धारित Answer कक्षाएं प्रदान करता है जिन्हें आप अपने मॉक को प्रारंभ कर सकते हैं। आप RETURNS_DEEP_STUBS पर देख सकते हैं, जो आपको इस समस्या के आसपास संभवतः प्राप्त करेगा।

1

क्या आप कृपया अपने प्रश्न को तैयार करने के लिए तैयार कोड के साथ अपडेट करेंगे। यहाँ कुछ कोड की समीक्षा सुझाव है:

इस सवाल का कोड के साथ

मुद्दे:

  • Article.java लापता आयात: org.springframework.beans.factory.annotation.Autowired
  • Article.java लापता आयात: org.springframework.transaction.annotation.Transactional
  • Article.java विशेषता वाक्य रचना मुद्दा: dbRequestHandler
  • Article.java विशेषता वाक्य रचना मुद्दा: filesystemRequestHandler
  • Article.java विधि नहीं initialized वापसी कथन है: articleDTO

यहाँ तुम क्या हो सकता है के रूप में आप तय उपरोक्त मुद्दों के साथ questionCode का उपयोग करना चाहिए है:

Article.java

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.transaction.annotation.Transactional; 

public class Article { 

    @Autowired 
    private Object dbRequestHandler; 

    @Autowired 
    private Object filesystemRequestHandler; 

    @Transactional 
    public ArticleDTO getArticleContents() { 

     // extractText() and then save the data in DTO 
     // extractImages() and then save the data in DTO 
     // some other calls to other databases to save data in dto 

     ArticleDTO articleDTO = null; 
     return articleDTO; 

    } 

    public void extractText() { 

     // call to DB 

    } 

    public void extractImages() { 

     // call to file system 

    } 
} 

IntegrationTest.java एक परीक्षण क्लास के लिए एक गरीब नाम है क्योंकि यह सामान्य है। मैं एक जावा यूनिट परीक्षण के लिए ArticleTest का सुझाव दूंगा।

ArticleTest.java

import org.junit.Assert; 
import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.mockito.InjectMocks; 
import org.mockito.Mock; 
import org.mockito.Mockito; 
import org.powermock.core.classloader.annotations.PrepareForTest; 
import org.powermock.modules.junit4.PowerMockRunner; 
import org.springframework.beans.factory.annotation.Autowired; 

@RunWith(PowerMockRunner.class) 
@PrepareForTest(ClassWithPrivate.class) 
public class ArticleTest { 

    @InjectMocks 
    private Article cut; 

    @Mock 
    private Object dbRequestHandler; 

    @Mock 
    private Object filesystemRequestHandler; 

    @Test 
    public void testeExtractImages() { 

     /* Initialization */ 
     Article articleMock = Mockito.spy(cut); 

     /* Mock Setup */ 
     Mockito.doNothing().when(articleMock).extractImages(); 

     /* Test Method */ 
     ArticleDTO result = cut.getArticleContents(); 

     /* Asserts */ 
     Assert.assertNull(result); 

    } 

} 
0

आप AdditionalAnswers.delegatesTo पद्धति का उपयोग कर सकते हैं। निम्नलिखित उदाहरण में, secondProxyDoingMocking घोषणा एक जासूस की तरह कुछ बनाता है (spy() विधि के कार्यान्वयन के साथ तुलना करें) सिवाय इसके कि यह "हल्के" विधि प्रतिनिधिमंडल का उपयोग करता है।

import org.mockito.AdditionalAnswers; 

public class ArticleTest { 

    @Autowired 
    private Article firstProxyDoingAutowiring; 

    @Test 
    public void testExtractImages() { 
     Article secondProxyDoingMocking = Mockito.mock(Article.class, 
       Mockito.withSettings().defaultAnswer(
         AdditionalAnswers.delegatesTo(firstProxyDoingAutowiring) 
       ) 
     ); 
     Mockito.doNothing().when(secondProxyDoingMocking).extractImages(); 
     ... 
    } 

} 

मैंने इस उदाहरण का परीक्षण नहीं किया, हालांकि मैंने इसे अपने कामकाजी कोड से इकट्ठा किया। मेरा उपयोग मामला समान था: दिए गए विधि के लिए निरंतर मूल्य लौटाएं, वसंत @Transactional -annotated बीन के सभी शेष विधियों के लिए असली विधि कॉल करें।

संबंधित मुद्दे