2010-06-09 9 views
6

EasyMock प्रलेखन बहुत स्पष्ट है किEasyMock - बराबरी के लिए व्यवहार को बदलने() और अन्य वस्तु तरीकों

तीन वस्तु तरीकों के लिए व्यवहार के बराबर होती है(), hashCode() और toString() के लिए बदला नहीं जा सकता मॉक ऑब्जेक्ट्स इज़ीमोक के साथ बनाए गए हैं, भले ही वे इंटरफ़ेस का हिस्सा हों जिसके लिए मॉक ऑब्जेक्ट बनाया गया हो।

कोड जो मैं परीक्षण करने का प्रयास कर रहा हूं, मेरे मॉक ऑब्जेक्ट की तुलना किसी अन्य चीज़ की तुलना करने के लिए करता है। मैं कुछ ऐसा करना चाहता हूं जैसे

expect(mock.equals(obj)).andReturn(false); 

जब मैं ऐसा करता हूं, तो मुझे एक IllegalStateException मिलता है। दस्तावेज कहता है, क्या कोई आश्चर्य नहीं है।

क्या किसी के पास वैकल्पिक दृष्टिकोण के लिए कोई सुझाव है? क्या नकल ऑब्जेक्ट वापस लौटने पर नियंत्रण करने का एक और तरीका है जब बराबर() इसे कहा जाता है? मुझे लगता है कि मैं एक उप-वर्ग बना सकता हूं जो बराबर ओवरराइड करता है()

class FooImplOverrideEquals extends FooImpl { 
    public boolean equals; 
    public boolean equals(Object obj) { return equals; } 
} 
FooImplOverrideEquals mock = createMock(FooImplOverrideEquals.class); 
mock.equals = false; // instead of expect(mock.equals(obj)).andReturn(false); 

लेकिन यह सुरुचिपूर्ण लगता है। मुझे लगता है कि मुझे कुछ महत्वपूर्ण याद आ रही है (इसी कारण से EasyMock आपको उन ऑब्जेक्ट विधियों को ओवरराइड नहीं करने देता है)। क्या कोई बेहतर समाधान है?

+0

तुम सिर्फ मीटर कॉल करने के लिए चाहते हैं ock.equals (कुछ), क्या आप विधि का नाम बदल नहीं सकते: mock.equalsalt (कुछ)? –

+0

हां, लेकिन कोड में मैं परीक्षण कर रहा हूं, मैं .equals() और नहीं .equalsalt() का उपयोग करना चाहता हूं। –

+0

मुझे लगता है, मोजे के बजाय आपको स्टब्स का उपयोग करने की आवश्यकता है :) –

उत्तर

4

कई मजाकिया पुस्तकालय इसका समर्थन नहीं करते हैं क्योंकि यह आम तौर पर एक बुरा विचार है। यदि आप बराबर() तुलना कर रहे हैं तो आपके पास एक मूल्य वस्तु है, असली सहयोगी नहीं है और आप वास्तविक उदाहरण का उपयोग कर बेहतर हैं। यदि आप कुछ अन्य अवधारणाओं का प्रतिनिधित्व करने के लिए बराबर() का उपयोग कर रहे हैं (यदि बेस्ट फ्रेंड विथ (अन्य)) है, तो आप उपयुक्त होने पर इसे रोक सकते हैं।

+1

मेरे मामले को उत्पन्न करने वाले विशेष मामले में, मैं एक नकली के बजाय एक वास्तविक उदाहरण का उपयोग कर समाप्त हुआ। मूल्य वस्तुओं बनाम सहयोगियों के बारे में आपकी व्याख्या बहुत समझ में आती है और शायद यह संभवतः मेरे दिमाग के पीछे क्या था, भले ही मैंने उन दो भूमिकाओं को जानबूझकर पहचाना नहीं था। –

3

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

EasyMock.cmp 

उदाहरण के लिए, यदि आप एक नाम और एक उम्र उदाहरण चर के साथ एक वर्ग व्यक्ति है, और आप केवल तुलना करने में रुचि रखते हैं:

तो फिर तुम विधि का उपयोग कर EasyMock उम्मीद में तुलनित्र उपयोग कर सकते हैं नाम:

public class Person { 
    String name; 
    int age; 

public boolean equals(Object obj) { 
     // the equals method compares the name and the age, but we are interested only in     
     // comparing the name 
     // other not-null checks... 
     Person other = (Person) obj; 
     if (this.age != other.age) { 
      return false; 
     } 
     if (other.name != null) { 
      return false; 
     } 
     return true; 
    } 
} 

public class PersonComparator implements Comparator<Person> { 
     @Override 
     public int compare(Person person1, Person person2) { 
      //compare only the name 
      if (person1.getName().equals(person2.getName())) { 
       return 0; 
      } 
      return -1; 
     } 

} 

और EasyMock.expect इस तरह का उपयोग करें:

PersonComparator nameComparator = new PersonComparator(); 

Person person = new Person("Ana"); //the age doesn't matter 

Person expectedPerson = EasyMock.cmp(comparisonPerson, nameComparator, LogicalOperator.EQUAL); 

EasyMock.expect(personService.authenticate(expectedPerson)).andReturn(true); 
संबंधित मुद्दे