2013-06-08 21 views
5

दुर्भाग्यवश मॉकिटो दस्तावेज़ों में संपूर्ण जानकारी की कमी है, इसलिए निम्न सेटअप को बनाने का उचित तरीका ढूंढना मुश्किल है।मॉकिटो: कक्षा के तरीके को प्रतिस्थापित करने के लिए कक्षा के तरीके को कैसे बदला जाए?

मेरे पास एक वर्ग "संसाधन प्रबंधक" है जिसका परीक्षण किया जाना चाहिए। यह वर्ग एक और वर्ग "जर्सी क्लाइंट" को तत्काल बनाता है जिसमें "प्राप्त" नामक एक विधि है। मुझे "संसाधन प्रबंधक" वास्तविक "जर्सी क्लाइंट" का आह्वान नहीं करता है, लेकिन इससे एक नकली (या एक स्टब?) का आह्वान करता है (यह पहले से ही अस्पष्ट है कि मॉकिटो संदर्भ में मॉकिंग और स्टबिंग या मोक्स और जासूसों के बीच क्या अंतर है)।

मेरे प्रयास @Mock (? या @Spy) JerseyClient लिए कर रहे हैं, या यह कम से कम एक विधि:

@RunWith(MockitoJUnitRunner.class) 
public class ResourceManagerTest 
{ 
    @Mock 
    private JerseyClient jerseyClient; 


    @Test 
    public void testResultHandling() throws JsonGenerationException, JsonMappingException, IOException, ResourceException 
    { 
     TestEntity testEntity = new TestEntity(); 
     ResourceManager resourceManager = new ResourceManager(); 

     testEntity.setGet(true); 
     testEntity.setTestAttribute("1stTest"); 

     when(jerseyClient.get(anyString())).thenReturn("{\"get\":true,\"testAttribute\":\"2ndTest\",\"message\":\"success\"}"); 

//  doReturn("{\"get\":true,\"testAttribute\":\"2ndTest\",\"message\":\"success\"}").when(jerseyClient).get(anyString()); 

     TestEntity result = (TestEntity)resourceManager.execute(testEntity, TestEntity.class); 

     assertThat(result, is(notNullValue())); 
     assertThat(result.getMessage(), is("success")); 
     assertThat(result.getTestAttribute(), is("2ndTest")); 
    } 
} 

आप देख सकते हैं, मैं jerseyClient.get (उपहास करने के लिए) विधि वापसी करने की कोशिश की एक पूर्वनिर्धारित JSON स्ट्रिंग:

when(jerseyClient.get(anyString())).thenReturn("{\"get\":true,\"testAttribute\":\"2ndTest\",\"message\":\"success\"}"); 

या

doReturn("{\"get\":true,\"testAttribute\":\"2ndTest\",\"message\":\"success\"}").when(jerseyClient).get(anyString()); 

लेकिन उनमें से कोई भी काम करते हैं। इसका मतलब है कि वास्तविक JerseyClient.get विधि का आह्वान किया जाता है, क्योंकि यह वास्तविक जर्सी क्लाइंट के साथ HTTP अनुरोध करने का प्रयास करता है।

समाधान क्या है और मैं यह क्या करना चाहता हूं? क्या यह किसी वास्तविक वस्तु पर जासूसी कर रहा है या किसी ऑब्जेक्ट का मज़ाक उड़ा रहा है जहां मैं इसकी विधि का नकल करना चाहता हूं, और जब मैं विधियों को प्रतिस्थापित कर सकता हूं, केवल मॉक्स या केवल जासूसों पर?

उत्तर

6

मुझे अपना जवाब मिला। मैं

@InjectMocks 
private ResourceManager resourceManager; 

जोड़ने की जरूरत है तो मैं इस उदाहरण के साथ परीक्षण चलाने की जरूरत है:

@RunWith(MockitoJUnitRunner.class) 
public class ResourceManagerTest 
{ 
    @Mock 
    private JerseyClient jerseyClient; 

    @InjectMocks 
    private ResourceManager resourceManager; 

    @Test 
    public void testResultHandling() throws JsonGenerationException, JsonMappingException, IOException, ResourceException 
    { 
     TestEntity testEntity = new TestEntity(); 

     testEntity.setGet(true); 
     testEntity.setTestAttribute("1stTest"); 

     when(jerseyClient.get(anyString())).thenReturn("{\"get\":true,\"testAttribute\":\"2ndTest\",\"message\":\"success\"}"); 

     TestEntity result = (TestEntity)resourceManager.execute(testEntity, TestEntity.class); 

     assertThat(result, is(notNullValue())); 
     assertThat(result.getMessage(), is("success")); 
     assertThat(result.getTestAttribute(), is("2ndTest")); 
    } 
} 

और मैं भी "doReturn ... जब" का उपयोग कर सकते पैटर्न।

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