हम मॉकिटो के साथ वास्तव में बुरा समस्या में आए।मॉकिटो: यदि मॉक को पारित तर्क संशोधित किया गया है तो क्या होगा?
कोड:
public class Baz{
private Foo foo;
private List list;
public Baz(Foo foo){
this.foo = foo;
}
public void invokeBar(){
list = Arrays.asList(1,2,3);
foo.bar(list);
list.clear();
}
}
public class BazTest{
@Test
void testBarIsInvoked(){
Foo mockFoo = mock(Foo.class);
Baz baz = new Baz(mockFoo);
baz.invokeBar();
verify(mockFoo).bar(Arrays.asList(1,2,3));
}
}
इस कारण त्रुटि संदेश की तरह:
Arguments are different! Wanted:
foo.bar([1,2,3]);
Actual invocation has different arguments:
foo.bar([]);
क्या बस हो गया:
Mockito रिकॉर्ड list
बल्किकी प्रतिलिपि से संदर्भ, इसलिए मैकिटो के ऊपर दिए गए कोड में संशोधित संस्करण (खाली सूची, []
) के बजाय वास्तव में आवंटन ([1,2,3]
) के दौरान पारित किए गए कोड के विरुद्ध सत्यापित किया गया है!
प्रश्न:
इस समस्या का किसी भी सुंदर और स्वच्छ समाधान नीचे की तरह एक रक्षात्मक नकल कर के अलावा अन्य है (जो वास्तव में मदद करता है, लेकिन हम इस समाधान पसंद नहीं है)?
public void fun(){
list = Arrays.asList(1,2,3);
foo.bar(new ArrayList(list));
list.clear();
}
हम सही उत्पादन कोड को संशोधित नहीं करना चाहती और इसके प्रदर्शन को कम केवल परीक्षण के साथ तकनीकी समस्या को ठीक करने के लिए।
मैं इस प्रश्न को यहां पूछ रहा हूं क्योंकि यह संभवतः मॉकिटो के साथ आम समस्या है। या हम बस कुछ गलत करते हैं?
पीएस। यह वास्तविक कोड नहीं है इसलिए कृपया यह न पूछें कि हम एक सूची क्यों बनाते हैं और फिर इसे साफ़ करते हैं। वास्तविक कोड में हमें कुछ ऐसा करने की वास्तविक आवश्यकता है :-)।
क्या आप वास्तव में एक ही तर्क वर्ग के _ अलग उदाहरण_ पर सत्यापित करते हैं? – fge
@fge हां, मेरे पास टेस्ट कोड में मूल उदाहरण तक कोई पहुंच नहीं है इसलिए मुझे अपेक्षित सामग्री के साथ परीक्षण में तर्क का एक नया उदाहरण बनाना होगा। –
फिर मेरा उत्तर देखें – fge