2010-11-15 19 views
19

के परीक्षण कोड का एक टुकड़ा मान लेते हैं:क्या मॉकिटो की सत्यापित विधि में jUnit Assert संदेश तर्क जैसी कोई चीज़ है?

Observable model = Class.forName(fullyQualifiedMethodName).newInstance(); 
Observer view = Mockito.mock(Observer.class); 
model.addObserver(view); 
for (Method method : Class.forName(fullyQualifiedMethodName).getDeclaredMethods()) 
{ 
    method.invoke(model, composeParams(method)); 
    model.notifyObservers(); 
    Mockito.verify(
    view, Mockito.atLeastOnce() 
).update(Mockito.<Observable>any(), Mockito.<Object>any()); 
} 

Mockito.verify विधि एक अपवाद फेंकता है तो एक मॉडल में एक विधि Observable.setChanged() विधि लागू नहीं किया है।

समस्या: loggers/System.print.out जोड़े बिना मैं वर्तमान पद्धति है कि परीक्षण में नाकाम रही है क्या पता ही नहीं सकता है। वहाँ jUnit Assert तरीकों को कुछ इसी तरह के होने का एक तरीका है:

Assert.assertEquals(
    String.format("instances %s, %s should be equal", inst1, inst2), 
    inst1.getParam(), 
    inst2.getParam() 
); 

समाधान:

verify(observer, new VerificationMode() 
{ 
    @Override 
    public void verify(VerificationData data) 
    { 
    assertTrue(
     format(
      "method %s doesn't call Observable#setChanged() after changing the state of the model", 
      method.toString() 
     ), 
     data.getAllInvocations().size() > 0); 
    } 
}).update(Mockito.<Observable>any(), Mockito.<Object>any()); 

उत्तर

17

यह चाल (सरल और स्पष्ट) करता है:

try { 
verify(myMockedObject, times(1)).doSomthing(); 
} catch (MockitoAssertionError e) { 
    throw new MockitoAssertionError("Was expecting a call to myMockedObject.doSomthing but got "+ e.getMessage()); 
} 
+6

दूसरे तर्क के रूप में कारण पारित करना संदेश को संयोजित करने से हमें बेहतर रूप से बेहतर है। 'नई MockitoAssertionError (" संदेश ", ई) फेंक' – Kapep

+1

MockitoAssertionError मापदंडों MockitoAssertionError के साथ एक निर्माता (स्ट्रिंग, अपवाद) नहीं है मैं का उपयोग 'नई AssertionError (" संदेश ", अपवाद)' बजाय के बाद से इस अपवाद प्रकार है कि दावा के लिए जुनीट द्वारा फेंक दिया गया है। –

3

वहाँ एक सीधा API कॉल कि सत्यापित करने पर एक संदेश की अनुमति देता है नहीं है। लेकिन मैं अगर तुम विधि वस्तु नहीं बल्कि Mockito.any से() का उपयोग, toString() विधि वर्ग पर में शुरू होगा और आप दे तुम क्या चाहते करने के लिए अपने को सत्यापित हस्ताक्षर बदलने लगता है।

ऐसा कुछ।

import static org.mockito.Matchers.anyObject; 
import static org.mockito.Mockito.atLeastOnce; 
import static org.mockito.Mockito.verify; 
import static org.mockito.Matchers.eq; 

... 

Observable model = Class.forName("class name").newInstance(); 

verify(view, times(1)).update(eq(model), anyObject()); 

for (Method method : Class.forName("class name").getDeclaredMethods()) 
{ 
    method.invoke(model, composeParams(method)); 
    model.notifyObservers(); 
    verify(view, atLeastOnce()).update(eq(method), anyObject()); 
} 
+0

अच्छी कोशिश है, लेकिन यह काम करने के लिए नहीं जा रहा है। पर्यवेक्षक # अद्यतन (ऑब्जेक्ट स्रोत, ऑब्जेक्ट Arg) का पहला तरीका वह मॉडल है जो परिवर्तन को प्रसारित कर रहा है, जिस तरीके से इसकी स्थिति बदल गई है। –

+0

बस उस उम्मीद को जोड़ें जिसे आप देखना चाहते हैं। यदि इसमें एक और प्रकार का अवलोकन योग्य है तो यह हो। –

+0

आपको शायद अधिक कोड जोड़ने की आवश्यकता है जो आपकी कक्षा संरचना को बेहतर बताती है। –

1

आप वर्तमान विधि पर जानकारी मुद्रित करने के लिए मैचर बना सकते हैं। यह थोड़ा उलझन वाला होगा, लेकिन सत्यापन विफल होने पर यह विधि नाम मुद्रित करेगा।

6

आप mockito में नहीं कर सकते। मॉकिटो सिंटैक्स अपेक्षित व्यवहार का परीक्षण करने में बहुत आसान बनाता है, लेकिन इसमें परीक्षण स्थिति की कोई अवधारणा नहीं है।

तुम क्या करने की कोशिश कर रहे क्या कुछ जानकारी है कि मज़ाक उड़ाया वस्तु में जब mocks उम्मीदों विफल रहता है नहीं कर रहे हैं है।

तुम सच में करना चाहते हैं, मैं 2 सामान्य तरीके देखें: या तो आप अपने खुद के verificationMode इंटरफ़ेस

org.mockito.verification; 
public static interface VerificationMode 

लागू करने और atLeastOnceMsd (स्ट्रिंग msg) की तरह एक विधि है कि में संदेश दिखाई देगा जोड़ने बनाने नाकाम रहने या वर्तमान परीक्षण किया विधि भीतरी पाश में एक ऐसी ही लाइन के साथ उदाहरण के लिए दृश्य वस्तु

के मॉडल में जोड़ने के मामले।

view.setName("now we are testing " + method.getName());