2012-01-31 10 views
32

मैं वर्तमान में मॉकिटो फ्रेमवर्क का अध्ययन कर रहा हूं और मैंने मॉकिटो का उपयोग करके कई परीक्षण केस बनाए हैं। लेकिन फिर मैंने पढ़ा है कि बजाय नकली (SomeClass .class) लागू की मैं @Mock और @InjectMocks उपयोग कर सकते हैं - केवल एक चीज मैं क्या करने की जरूरत @RunWith(MockitoJUnitRunner.class) साथ अपने परीक्षण वर्ग व्याख्या या @Before विधि में MockitoAnnotations.initMocks(this); उपयोग करने के लिए है।@Mock और @InjectMocks का उपयोग

लेकिन यह काम नहीं करता है - ऐसा लगता है कि @Mock काम नहीं करेगा! यहां मेरे 2 कोड संशोधन हैं - एक एनोटेशन का उपयोग करके और बिना किसी के।

मैं क्या गलत कर रहा हूं?

public class ReportServiceImplTestMockito { 

    private TaskService  mockTaskService; // This is the Mock object 
    private ReportServiceImpl service; 

    @Before 
    public void init(){ 
     service   = new ReportServiceImpl(); 
     mockTaskService = mock(TaskServiceImpl.class); 
     service.setTaskServiceImpl(mockTaskService); 
    } 
/// ... 

Some tests 
} 

जैसा कि मैंने कहा - यह बहुत अच्छा काम है। लेकिन निम्नलिखित अभ्यस्त:

@Service 
public class ReportServiceImpl implements ReportService { 

    @Autowired 
    private TaskService taskServiceImpl; 

    public ReportServiceImpl(){} 

    public ReportServiceImpl(TaskService taskService){ 
     this.taskServiceImpl = taskService; 
    } 

    public void setTaskServiceImpl(TaskService taskServiceImpl) { 
     this.taskServiceImpl = taskServiceImpl; 
    } 
} 

मैं क्या याद आ रही है:

@RunWith(MockitoJUnitRunner.class) 
public class ReportServiceImplTestMockito { 

    @Mock 
    private TaskService  mockTaskService; 

    @InjectMocks 
    private ReportServiceImpl service; 

     // Some tests 
} 

और यहाँ ReportServiceImpl वर्ग है?

+0

पहली नज़र में, मेरे लिए ठीक दिखता है। आपके लिए वास्तव में क्या गलत हो रहा है? –

+1

@NOM क्या आप वाकई सही आयात का उपयोग कर रहे हैं? – Brice

+0

डेविड - मुझे एक NullPointerException मिल रहा है। और ब्राइस, मेरा मानना ​​है कि मैं सही आयात का उपयोग कर रहा हूं - यहां वे 'import org.jmock.auto.Mock; आयात org.junit.runner.RunWith; आयात org.mockito.InjectMocks; आयात org.mockito.MockitoAnnotations; आयात org.mockito.runners.MockitoJUnitRunner; ' – Noam

उत्तर

24

O.K, मैं अपनी गलती मिल गया !!! मैंने @InjectMocks का उपयोग किया है लेकिन init() विधि में एक ही वैरिएबल प्रारंभ किया है ... तो क्या हुआ कि मॉकिटो ने मेरे चर के लिए नकली ऑब्जेक्ट इंजेक्शन दिया - लेकिन सेकंड बाद में मैंने इसे चलाया - उसी वैरिएबल को शुरू करना! !!

3

मुझे यकीन है कि नहीं कर रहा हूँ, लेकिन ReportServiceImpl मैन्युअल का नया उदाहरण बनाने के लिए (के रूप में आप काम कर रहे उदाहरण में किया था) की कोशिश:

@InjectMocks 
private ReportServiceImpl service = new ReportServiceImpl(); 
+3

एज केस के अपवाद पर मॉकिटो 1.9 के बाद यह अब और आवश्यक नहीं है। – Brice

+1

यदि आप 1.8 का उपयोग कर रहे हैं, तो आपको इसे प्रारंभकर्ता या कन्स्ट्रक्टर में तुरंत चालू करने की आवश्यकता नहीं है जब तक कि आप 'MockitoAnnotations.initMocks (this)' का उपयोग नहीं कर रहे हैं, इस मामले में, आपको इसे कहने से पहले इसे तुरंत चालू करने की आवश्यकता है। – jhericks

+3

सबसे पहले, उत्तरों के लिए धन्यवाद। लेकिन MockitoAnnotations.initMocks (यह) का उपयोग करना अनिवार्य नहीं है क्योंकि मैंने @RunWith (MockitoJUnitRunner.class) का उपयोग किया था। – Noam

12

आपका कोड मेरे लिए ठीक काम करता है Mockito 1.9 का उपयोग कर।

मॉकिटो के 1.8+ संस्करण का उपयोग करके मुझे एक बहुत ही विशिष्ट त्रुटि संदेश मिलता है जो मुझे समस्या को ठीक करने का तरीका बताता है। जैसा कि php-coder सुझाव देता है: Mockito 1.8+ के लिए आपको फ़ील्ड को प्रारंभ करने की आवश्यकता है।

क्या आपको यह या कोई अन्य त्रुटि संदेश दिखाई देता है?

संपादित करें:

निम्नलिखित कोड मेरे लिए काम करता है। छोटे परिवर्तन:

  • निकाला गया स्प्रिंग एनोटेशन
  • निकाला गया इंटरफ़ेस
  • जोड़ा मनुष्य
  • जोड़ी खाली TaskService
  • जोड़ा गया System.out.println

के साथ परीक्षण यह आप के लिए कोई त्रुटि उत्पन्न करता है? :

सेवा:

public class ReportServiceImpl { 

    private TaskService taskServiceImpl; 


    public ReportServiceImpl() { 

    } 


    public ReportServiceImpl(TaskService taskService) { 
     this.taskServiceImpl = taskService; 
    } 


    public void setTaskServiceImpl(TaskService taskServiceImpl) { 
     this.taskServiceImpl = taskServiceImpl; 
    } 


    public TaskService getTaskServiceImpl() { 
     return taskServiceImpl; 
    } 
} 

निर्भरता:

public class TaskService { 

} 

टेस्ट, प्रिंट mockTaskService:

@RunWith(MockitoJUnitRunner.class) 
public class ReportServiceImplTestMockito { 

    @Mock 
    private TaskService  mockTaskService; 

    @InjectMocks 
    private ReportServiceImpl service; 


    @Test 
    public void testMockInjected() { 
     System.out.println(service.getTaskServiceImpl()); 
    } 
} 
+0

हाय, मैं मॉकिटो 1.9 का भी उपयोग कर रहा हूं ... – Noam

+1

जैसा कि मैंने कहा है, कोड मेरे लिए काम करता है। क्या आप पोस्ट किए गए कोड का परीक्षण कर सकते हैं (केवल छोटे बदलाव)? –

+0

हाय अरेंड, देरी के लिए खेद है - लेकिन आपका कोड मेरे लिए भी काम करता है, मैंने @Mock एनोटेशन के लिए एक worng आयात का उपयोग किया है - import org.mockito.MockitoAnnotations; आयात org.mockito.Mock आयात करने के बजाय; – Noam