ঠাট্টা করা বনাম বিদ্রূপ করা ফ্রেমওয়ার্কগুলিতে গুপ্তচরবৃত্তি করা


131

মশকরা ফ্রেমওয়ার্কগুলিতে, আপনি কোনও বিষয়টিকে বিদ্রূপ করতে বা এটিতে গুপ্তচরবৃত্তি করতে পারেন। দুজনের মধ্যে পার্থক্য কী এবং কখন / আমার একে অপরকে ব্যবহার করা উচিত?

উদাহরণস্বরূপ, মকিতোর দিকে তাকানো আমি দেখতে পেলাম গুপ্তচর এবং বিদ্রূপ ব্যবহার করে একই রকম কাজ করা হচ্ছে তবে আমি দুজনের মধ্যে পার্থক্য সম্পর্কে নিশ্চিত নই।



উত্তর:


157

মক অবজেক্ট সম্পূর্ণরূপে উপহাস করা ক্লাস প্রতিস্থাপন করে, রেকর্ডকৃত বা ডিফল্ট মানগুলি ফিরিয়ে দেয়। আপনি "পাতলা এয়ার" থেকে মক তৈরি করতে পারেন। এটি বেশিরভাগ ইউনিট পরীক্ষার সময় ব্যবহৃত হয়।

গুপ্তচরবৃত্তি করার সময়, আপনি একটি বিদ্যমান অবজেক্ট নেন এবং কেবলমাত্র কয়েকটি পদ্ধতি "প্রতিস্থাপন" করেন। এটি দরকারী যখন আপনার বিশাল বর্গ থাকে এবং কেবল নির্দিষ্ট পদ্ধতিগুলি (আংশিক উপহাস) উপহাস করতে চান। আমাকে মকিতো ডকুমেন্টেশন উদ্ধৃত করুন :

আপনি বাস্তব বস্তুর গুপ্তচর তৈরি করতে পারেন। আপনি যখন গুপ্তচর ব্যবহার করেন তখন আসল পদ্ধতিগুলি বলা হয় (যদি না কোনও পদ্ধতিতে স্ট্যাব করা হত)।

বাস্তব গুপ্তচরগুলি যত্ন সহকারে এবং মাঝে মাঝে ব্যবহার করা উচিত , উদাহরণস্বরূপ যখন উত্তরাধিকারের কোডটি নিয়ে কাজ করা হয়।

সন্দেহ হলে, মোক ব্যবহার করুন।


1
ধন্যবাদ! এটি এটি আরও পরিষ্কার করে তোলে। সুতরাং উপহাসগুলি কখনই আসল বস্তুটির সাথে উপহাস করা যায় না , তবে গুপ্তচররা তা করে।
ভিভিন পালিথ

7
মকগুলির একটি "আসল অবজেক্ট" থাকে না - মক তৈরি করা হয় আরম্ভ করে।
কার্ল ম্যানাস্টার

4
মকিটো কেন সবসময় গুপ্তচর ব্যবহারের বিরুদ্ধে সতর্ক করে? এর কোন ব্যাখ্যা? আমি দেখতে পাচ্ছি যে তারা বিদ্রূপের পক্ষে বলেছে, তবে এর কারণ সম্পর্কে আমি পরিষ্কার নয়।
ম্যাট

9
আমি নিশ্চিত নই, তবে সম্ভবত তারা "মকিতো" এবং "স্পাইটো" নয়: ডি
typoerrpr

16

মকিতো সতর্ক করে দিয়েছে যে আংশিক উপহাস করা ভাল অনুশীলন নয় এবং আপনার অবজেক্ট ওরিয়েন্টেড আর্কিটেকচারটি সংশোধন করা উচিত। লিগ্যাসি কোডটি পরীক্ষা করার জন্য স্পাই (বা আংশিক উপহাস) বাঞ্ছনীয় ।


16

আমি এখানে একটি উদাহরণ ব্যবহার করে ব্যাখ্যা করার চেষ্টা করব:

// Difference between mocking, stubbing and spying
@Test
public void differenceBetweenMockingSpyingAndStubbing() {
    List list = new ArrayList();
    list.add("abc");
    assertEquals(1, list.size());

    List mockedList = spy(list);
    when(mockedList.size()).thenReturn(10);
    assertEquals(10, mockedList.size());
}

এখানে, আমাদের প্রারম্ভিক বাস্তব অবজেক্ট ছিল list, যার মধ্যে আমরা একটি উপাদান যুক্ত করেছি এবং আকারটি এক হওয়ার প্রত্যাশিত।

আমরা রিয়েল অবজেক্টের অর্থ গুপ্তচর করি যার অর্থ আমরা কোন পদ্ধতিতে স্ট্যাবড করতে হবে তা নির্দেশ দিতে পারি । সুতরাং আমরা ঘোষিত আমরা stubbed যে পদ্ধতি - size()উপর গুপ্তচর বস্তুর যা 10 ফিরে আসবে, সেটা ব্যাপার আসল আকার কি।

সংক্ষেপে, আপনি হবে গুপ্তচর বাস্তব বস্তু এবং শহরের উপর অসম্পূর্ণ নিবন্ধ পদ্ধতির কিছু


2

তথ্যসূত্র: http://javapointers.com/tutorial/differences-between-spy-and-mock-in-mockito/

মক অবজেক্টগুলি ব্যবহার করার সময়, স্টাব যখন না হয় তখন পদ্ধতির ডিফল্ট আচরণ কিছুই করে না। সরল অর্থ, যদি এটি একটি অকার্যকর পদ্ধতি হয়, তবে আপনি যখন পদ্ধতিটি কল করবেন তখন এটি কিছুই করবে না বা যদি কোনও পদ্ধতিটি যদি কোনও রিটার্ন সহ এটি হয় তবে তা নাল, খালি বা ডিফল্ট মান ফিরে আসতে পারে।

স্পাই অবজেক্টে থাকা অবস্থায় অবশ্যই এটি যেহেতু একটি আসল পদ্ধতি, আপনি যখন পদ্ধতিটি স্টাবি করছেন না, তখন এটি আসল পদ্ধতির আচরণ বলে। আপনি যদি পদ্ধতিটি পরিবর্তন এবং উপহাস করতে চান, তবে আপনার এটির স্টাব করা দরকার।


2

ডামি অবজেক্টগুলি চারপাশে পাস হলেও বাস্তবে কখনও ব্যবহৃত হয় না। সাধারণত এগুলি কেবলমাত্র প্যারামিটারের তালিকা পূরণ করতে ব্যবহৃত হয়।

নকল বস্তুগুলিতে আসলে কার্যকরী বাস্তবায়ন থাকে তবে সাধারণত কিছু শর্টকাট নেয় যা এগুলি উত্পাদনের জন্য উপযুক্ত করে না (মেমরিের ডাটাবেসে একটি ভাল উদাহরণ)।

স্টাবগুলি পরীক্ষার সময় করা কলগুলিতে ক্যানড উত্তর সরবরাহ করে, সাধারণত পরীক্ষার জন্য কী কী প্রোগ্রাম করা হয় তার বাইরে কিছুতেই সাড়া দেয় না।

স্পাইস হ'ল স্টাব যা এগুলি কীভাবে ডাকা হয়েছিল তার উপর ভিত্তি করে কিছু তথ্য রেকর্ড করে। এর একটি ফর্ম একটি ইমেল পরিষেবা হতে পারে যা এটি পাঠিয়েছিল যে কতগুলি বার্তা রেকর্ড করে।

মোক আমরা এখানে যে বিষয়ে কথা বলছি তা হ'ল : প্রাক-প্রোগ্রামযুক্ত অবজেক্টগুলি প্রত্যাশাগুলি যা তারা যে কলগুলি প্রত্যাশা করা হবে তার একটি স্পেসিফিকেশন গঠন করে।

মটিন মার্টিন ফওলারের স্টাবস নয়


1

গুপ্তচরদের দুটি সংজ্ঞা রয়েছে। এক, যেখানে আসল পদ্ধতিটি বলা হয়, অন্যটি যেখানে কোনও কার্যকারিতা বলা হয় না এবং কেবল নাল বা নাল সমতুল্য মানগুলি ফিরে আসে, তবে পদ্ধতিগুলি বলা হয়েছিল, এবং সেগুলি রাষ্ট্র রেকর্ড করা হয়েছিল, সাধারণত, পদ্ধতি x কে y বার বলা হত।


0

মকিতোতে আপনি যদি কোনও বস্তুকে মক অবজেক্টের ভেরিয়েবলের উদাহরণ দেয় তবে মক অবজেক্টে প্রভাব ফেলবে না।

তবে স্পাইয়ের ক্ষেত্রে, আপনি যদি স্পাই অবজেক্টের ভেরিয়েবলের কোনও বিষয় নির্দিষ্ট করেন তবে রিয়েল-টাইম অবজেক্টের পরিবর্তনের মতো স্পাই অ্যাক্টের কারণে স্পাই অবজেক্টে প্রভাব ফেলবে।

একটি রেফারেন্স উদাহরণ জন্য

@RunWith(MockitoJUnitRunner.class)
public class MockSpyExampleTest {

    @Mock
    private List<String> mockList;

    @Spy
    private List<String> spyList = new ArrayList();

    @Test
    public void testMockList() {
        //by default, calling the methods of mock object will do nothing
        mockList.add("test");
        assertNull(mockList.get(0));
    }

    @Test
    public void testSpyList() {
        //spy object will call the real method when not stub
        spyList.add("test");
        assertEquals("test", spyList.get(0));
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.