মকিতো ব্যবহার করে ব্যক্তিগত পদ্ধতি পরীক্ষা করা হচ্ছে


104
পাবলিক ক্লাস এ {

    পাবলিক শূন্য পদ্ধতি (বুলিয়ান বি) {
          যদি (খ == সত্য)
               method1 ();
          আর
               method2 ();
    }

    ব্যক্তিগত শূন্য পদ্ধতি 1 ()}}
    ব্যক্তিগত শূন্য পদ্ধতি 2 () {}
}
পাবলিক ক্লাস টেস্টএ {

    @Test
    পাবলিক শূন্য পরীক্ষা মেঠোড () {
      এ এ = মক (এ.ক্লাস);
      a.method (সত্য);
      // কীভাবে যাচাই (ক) .মাদ্দিক 1 () এর মতো পরীক্ষা করা যায়;
    }
}

কীভাবে বেসরকারী পদ্ধতি পরীক্ষা করতে হয় তাকে বলা হয় বা না, এবং কীভাবে মকিতো ব্যবহার করে ব্যক্তিগত পদ্ধতি পরীক্ষা করা যায় ???


উত্তর:


81

আপনি মকিতো দিয়ে এটি করতে পারবেন না তবে আপনি মকিতো এবং মকিত ব্যক্তিগত পদ্ধতিগুলিকে প্রসারণ করতে পাওয়ারমক ব্যবহার করতে পারেন । পাওয়ারমক মকিতোকে সমর্থন করে। এখানে একটি উদাহরণ।


19
আমি এই উত্তর নিয়ে বিভ্রান্ত এটি উপহাস করছে, তবে শিরোনামটি ব্যক্তিগত পদ্ধতিগুলি পরীক্ষা করছে
ডায়োদা_

আমি ব্যক্তিগত পদ্ধতিটিকে উপহাস করার জন্য পাওয়ারমক ব্যবহার করেছি, তবে কীভাবে আমি পাওয়ারমক দিয়ে ব্যক্তিগত পদ্ধতিটি পরীক্ষা করতে পারি। কোথায়, আমি কিছু ইনপুট পাস করতে পারি এবং পদ্ধতি থেকে কিছু আউটপুট আশা করতে পারি এবং তারপরে আউটপুটটি যাচাই করতে পারি?
রিতো

আপনি পারবেন না। আপনি মজাদার ইনপুট আউটপুট, আপনি আসল কার্যকারিতা পরীক্ষা করতে পারবেন না।
তালহা

131

মকিতোর মাধ্যমে সম্ভব নয়। তাদের উইকি থেকে

মকিতো ব্যক্তিগত পদ্ধতিগুলি কেন উপহাস করে না?

প্রথমত, আমরা ব্যক্তিগত পদ্ধতিগুলিকে ঠাট্টা-বিদ্রূপ করার বিষয়ে গোপনীয় নই। আমরা কেবলমাত্র ব্যক্তিগত পদ্ধতিগুলির বিষয়ে চিন্তা করি না কারণ পরীক্ষার দিক থেকে ব্যক্তিগত পদ্ধতিগুলির অস্তিত্ব নেই। এখানে মকিটো ব্যক্তিগত পদ্ধতিগুলি উপহাস না করার কয়েকটি কারণ রয়েছে:

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

এটি কাজ করা খুব সহজ - কেবল ব্যক্তিগত থেকে প্যাকেজ-সুরক্ষিত (বা সুরক্ষিত) পদ্ধতির দৃশ্যমানতা পরিবর্তন করুন।

এটির প্রয়োগ ও বজায় রাখতে আমার সময় কাটাতে হবে। এটি প্রদত্ত পয়েন্ট # 2 এবং এটি ইতিমধ্যে বিভিন্ন সরঞ্জামে (পাওয়ারমক) প্রয়োগ করা হয়েছে তা বোঝা যায় না।

অবশেষে ... ব্যক্তিগত পদ্ধতিগুলিকে ঠাট্টা করা একটি ইঙ্গিত যা ওও বোঝার সাথে কিছু ভুল আছে। ওওতে আপনি অবজেক্টগুলি (বা ভূমিকা) সহযোগিতা করতে চান, পদ্ধতি নয়। পাস্কেল এবং পদ্ধতিগত কোড সম্পর্কে ভুলে যান। বস্তুতে চিন্তা করুন।


1
এই বিবৃতিটির দ্বারা একটি মারাত্মক অনুমান করা হয়েছে:> ব্যক্তিগত পদ্ধতিগুলি উপহাস করা ও ও বোঝার সাথে কিছু ভুল আছে এমন একটি ইঙ্গিত। যদি আমি কোনও সর্বজনীন পদ্ধতি পরীক্ষা করে দেখি এবং এটি ব্যক্তিগত পদ্ধতিগুলিকে কল করে তবে আমি ব্যক্তিগত পদ্ধতির রিটার্নকে উপহাস করতে চাই। উপরোক্ত অনুমানটি অনুসরণ করে এমনকি ব্যক্তিগত পদ্ধতিগুলি প্রয়োগ করার প্রয়োজনকেও বাধ্য করে। ওও সম্পর্কে এটি কীভাবে খারাপ বোঝা যায়?
ডিম্বাণু

1
@ ইজিগমেটারগুলি বেলডুংয়ের মতে "উপহাসের কৌশলগুলি ক্লাসের বাহ্যিক নির্ভরতাগুলির উপর প্রয়োগ করা উচিত এবং এটি ক্লাসের নিজস্ব নয়। আমাদের ক্লাসগুলি পরীক্ষা করার জন্য যদি ব্যক্তিগত পদ্ধতিগুলি উপহাস করা জরুরি হয় তবে এটি সাধারণত একটি খারাপ নকশাকে নির্দেশ করে।" এটি সম্পর্কে একটি দুর্দান্ত থ্রেড এখানে রয়েছে সফ্টওয়্যারেনজেনারিং.স্ট্যাকেক্সেঞ্জার.কম
সেকশনস / 100959/…

34

পাওয়ারমক দিয়ে এটি কীভাবে করবেন তা এখানে একটি ছোট উদাহরণ

public class Hello {
    private Hello obj;
    private Integer method1(Long id) {
        return id + 10;
    }
} 

পদ্ধতি 1 ব্যবহার কোড পরীক্ষা করতে :

Hello testObj = new Hello();
Integer result = Whitebox.invokeMethod(testObj, "method1", new Long(10L));

ব্যক্তিগত বস্তুর সেট করতে OBJ এই ব্যবহার করুন:

Hello testObj = new Hello();
Hello newObject = new Hello();
Whitebox.setInternalState(testObj, "obj", newObject);

আপনার লিঙ্কটি কেবলমাত্র মিনডোগাসকে পাওয়ার মক রেপোতে ইঙ্গিত করছে
জ্যাভিয়ার

@ সত্য সত্য আপনি যদি আপনার প্রকল্পে পছন্দ করেন তবে আপনি এটি ব্যবহার করতে পারেন।
মাইন্ডোগাস জারামিনাস

1
অপূর্ব !!! এই সাধারণ উদাহরণটি প্রায় সমস্ত কিছুর সাথে খুব ভালভাবে ব্যাখ্যা করা হয়েছে :) কারণ উদ্দেশ্য কেবল কোডটি পরীক্ষা করা এবং সমস্ত কাঠামো যা সরবরাহ করে তা নয় :)
সিদ্ধुसিংহ

দয়া করে এটি আপডেট করুন। হোয়াইটবক্স আর পাবলিক এপিআই এর অংশ নয় is
ব্যবহারকারী 447607

17

আচরণের ক্ষেত্রে এটি সম্পর্কে চিন্তা করুন, কী কী পদ্ধতি রয়েছে তার শর্তে নয়। methodযদি bসত্য হয় তবে পদ্ধতিটি একটি নির্দিষ্ট আচরণ করে । bমিথ্যা হলে এর আলাদা আচরণ রয়েছে । এর অর্থ আপনার জন্য দুটি আলাদা পরীক্ষা লিখতে হবে method; প্রতিটি ক্ষেত্রে একটি। সুতরাং তিনটি পদ্ধতি-ভিত্তিক পরীক্ষার পরিবর্তে (একটির জন্য method, একটির জন্য method1, একজনের জন্য method2) আপনার দুটি আচরণ-ভিত্তিক পরীক্ষা রয়েছে।

এর সাথে সম্পর্কিত (আমি সম্প্রতি অন্য এসও থ্রেডে এটির পরামর্শ দিয়েছি, এবং ফলস্বরূপ একটি চার অক্ষরের শব্দের নাম পেয়েছি, তাই এটি লবণের দানা দিয়ে নিখরচায় বোধ করুন); পদ্ধতির নাম না দিয়ে পরীক্ষার নামগুলি নির্বাচন করা যে আমি যা আচরণ করছি তা প্রতিবিম্বিত করে এমনটি বেছে নেওয়া আমার পক্ষে সহায়ক মনে হয়েছে। সুতরাং আপনার পরীক্ষার কল না testMethod(), testMethod1(), testMethod2()এবং তাই ঘোষণা। আমি এর মতো নাম পছন্দ করি calculatedPriceIsBasePricePlusTax()বা taxIsExcludedWhenExcludeIsTrue()এটি আমার আচরণের পরীক্ষার ইঙ্গিত দেয়; তারপরে প্রতিটি পরীক্ষার পদ্ধতির মধ্যে কেবলমাত্র নির্দেশিত আচরণ পরীক্ষা করুন। এই জাতীয় বেশিরভাগ আচরণে একটি সর্বজনীন পদ্ধতিতে কেবল একটি কল জড়িত থাকে তবে ব্যক্তিগত পদ্ধতিতে অনেকগুলি কল জড়িত থাকতে পারে।

আশাকরি এটা সাহায্য করবে.


13

যদিও মকিতো সেই ক্ষমতাটি সরবরাহ করে না, আপনি মকিতো + জুনিত রিফ্লেকশনUtils ক্লাস বা স্প্রিং রিফ্লেকশন টেস্টুটিলস ক্লাস ব্যবহার করে একই ফলাফল অর্জন করতে পারেন । দয়া করে থেকে নেওয়া নীচে একটি উদাহরণ দেখতে এখানে ব্যাখ্যা একটি প্রাইভেট পদ্ধতি ডাকা কিভাবে:

ReflectionTestUtils.invokeMethod(student, "saveOrUpdate", "From Unit test");

রিফ্লেকশন টেস্টইটিলস এবং মকিতো সহ সম্পূর্ণ উদাহরণগুলি বসন্তের জন্য মকিতো বইয়ে পাওয়া যাবে


রিফ্লেকশনটেষ্টটিলিট.ইন.ভোকেথ ম্যাথোড (শিক্ষার্থী, "সেভআরআপডেট", "আর্গুমেন্ট 1", "আর্গুমেন্ট 2", "আর্গুমেন্ট 3"); ইনভোকমেথোডের শেষ যুক্তিটি ভার্জ ব্যবহার করে যা একাধিক যুক্তি গ্রহণ করতে পারে যা ব্যক্তিগত পদ্ধতিতে প্রেরণ করা দরকার। এটা কাজ করে।
টিম

এই উত্তরের ব্যক্তিগত পদ্ধতিগুলি পরীক্ষা করার সবচেয়ে সহজতম উপায়টি আরও বেশি হওয়া উচিত।
সর্বোচ্চ

9

আপনি ব্যক্তিগত পদ্ধতি পরীক্ষা করার জন্য ভাবেন না। কেবল বেসরকারী পদ্ধতিগুলির পরীক্ষা করা দরকার কারণ এগুলি যে কোনওভাবে ব্যক্তিগত পদ্ধতিতে কল করা উচিত। আপনি যদি ব্যক্তিগত পদ্ধতিগুলি পরীক্ষা করতে "চান", এটি ইঙ্গিত করতে পারে যে আপনাকে নিজের ডিজাইনের পুনর্বিবেচনা করতে হবে:

আমি কি সঠিক নির্ভরতা ইনজেকশন ব্যবহার করছি? আমার সম্ভবত ব্যক্তিগত পদ্ধতিগুলি একটি পৃথক শ্রেণিতে স্থানান্তরিত করার পরিবর্তে এটি পরীক্ষা করার দরকার আছে? এই পদ্ধতিগুলি কি ব্যক্তিগত হতে হবে? ... সেগুলি কি ডিফল্ট বা পরিবর্তিত সুরক্ষিত হতে পারে না?

উপরের উদাহরণে, দুটি পদ্ধতি যা "এলোমেলোভাবে" বলা হয় আসলে তাদের নিজস্ব একটি শ্রেণিতে স্থাপন করা প্রয়োজন, পরীক্ষা করা এবং তারপরে উপরের শ্রেণিতে ইনজেকশনের প্রয়োজন।


26
একটি বৈধ পয়েন্ট। তবে, পদ্ধতিগুলির জন্য কোনও প্রাইভেট মডিফায়ার ব্যবহার করার কারণটি নয় কারণ আপনি কেবল খুব দীর্ঘ এবং / অথবা পুনরাবৃত্তিযুক্ত কোডগুলি কেটে ফেলতে চান? এটিকে অন্য শ্রেণীর হিসাবে পৃথক করা যেমন আপনি সেই লাইন কোডগুলিকে প্রথম শ্রেণির নাগরিক হিসাবে প্রচার করছেন যা অন্য কোথাও পুনরায় ব্যবহার করা হবে না কারণ এটি বিশেষত লম্বা কোডগুলি বিভক্তকরণ এবং কোডগুলির পুনরাবৃত্তি লাইনগুলি রোধ করার জন্য বোঝানো হয়েছিল। আপনি যদি এটি অন্য শ্রেণিতে পৃথক করতে যাচ্ছেন তবে এটি ঠিক মনে হয় না; আপনি সহজেই ক্লাস বিস্ফোরণ পেতে পারেন।
সুপার্টনস্কি

2
সুপারটোনস্কি হিসাবে উল্লেখযোগ্য, আমি সাধারণ মামলার কথা উল্লেখ করছিলাম। আমি একমত যে উপরের ক্ষেত্রে এটি পৃথক শ্রেণিতে না হওয়া উচিত। (যদিও আপনার মন্তব্যে +1 - এটি ব্যক্তিগত মেম্বারদের প্রচারের পক্ষে তৈরি করা একটি খুব বৈধ পয়েন্ট)
জ্যাকো ভ্যান নিকের্ক

4
@ সুপার্টনস্কি, আমি এই সমস্যার কোনও সন্তোষজনক প্রতিক্রিয়া খুঁজে পাইনি। আমি ব্যক্তিগত সদস্যদের কেন ব্যবহার করতে পারি তার বেশ কয়েকটি কারণ রয়েছে এবং প্রায়শই তারা কোনও কোডের গন্ধ নির্দেশ করে না এবং এগুলি পরীক্ষা করে আমি প্রচুর উপকৃত হব। লোকেরা "শুধু এটি করবেন না" বলে এটিকে ব্রাশ করে বলে মনে হচ্ছে।
লুডিপ্যান্টস

3
দুঃখিত, আমি "যদি আপনি ব্যক্তিগত পদ্ধতি পরীক্ষা করতে চান" এর উপর ভিত্তি করে ডাউনওয়েটের বিকল্পটি বেছে নিয়েছিলেন, তবে এটি আপনাকে আপনার নকশাকে নিম্নমানের প্রয়োজন হতে পারে "নির্দেশ করে। ঠিক আছে, যথেষ্ট ন্যায্য, তবে একেবারে পরীক্ষার কারণগুলির একটি কারণ কারণ, যখন আপনার কাছে নকশাটি নিয়ে পুনর্বিবেচনা করার সময় নেই তখন আপনি নিরাপদে এমন একটি পরিবর্তন আনার চেষ্টা করছেন যা একটি পরিবর্তন করা দরকার ব্যক্তিগত পদ্ধতি একটি আদর্শ বিশ্বে সেই নকশাটি নিখুঁত হবে বলেই কী ব্যক্তিগত পদ্ধতিটি পরিবর্তন করার দরকার নেই? অবশ্যই, তবে একটি নিখুঁত বিশ্বে, তবে এটি কার্যকর কারণ একটি নিখুঁত বিশ্বে যাদের পরীক্ষা দরকার, এটি সব ঠিক কাজ করে। :)
জন লকউড

2
@John। পয়েন্ট নেওয়া হয়েছে, আপনার ডাউনভোটটি ওয়্যারেন্টেড (+1)। মন্তব্যের জন্যও ধন্যবাদ - আপনি যে বক্তব্যটি দিয়েছেন তাতে আমি আপনার সাথে একমত। এই ক্ষেত্রে আমি দুটি বিকল্পের মধ্যে একটি দেখতে পাচ্ছি: হয় পদ্ধতিটি প্যাকেজ-প্রাইভেট বা সুরক্ষিত এবং ইউনিট টেস্টগুলি যথারীতি লিখিত হয়; বা (এবং এটি জিভ-ইন-গাল এবং খারাপ অনুশীলন) এটি এখনও কাজ করে তা নিশ্চিত করার জন্য একটি প্রধান পদ্ধতি দ্রুত লেখা হয়। যাইহোক, আমার প্রতিক্রিয়াটি নতুন কোড লিখিত হওয়ার এবং আপনি যখন মূল নকশাটি নিয়ে টেম্পার করতে না পারেন তখন রিফ্যাক্টর না করার দৃশ্যের ভিত্তিতে তৈরি হয়েছিল।
জ্যাকো ভ্যান নিকের্ক

6

আমি প্রতিবিম্ব ব্যবহার করে মকিতো ব্যবহার করে ভিতরে একটি ব্যক্তিগত পদ্ধতি পরীক্ষা করতে সক্ষম হয়েছি। উদাহরণটি এখানে দেওয়া হল, এটির নামকরণের চেষ্টা করুন যাতে এটি বোঝা যায়

//Service containing the mock method is injected with mockObjects

@InjectMocks
private ServiceContainingPrivateMethod serviceContainingPrivateMethod;

//Using reflection to change accessibility of the private method

Class<?>[] params = new Class<?>[]{PrivateMethodParameterOne.class, PrivateMethodParameterTwo.class};
    Method m = serviceContainingPrivateMethod .getClass().getDeclaredMethod("privateMethod", params);
    //making private method accessible
    m.setAccessible(true); 
    assertNotNull(m.invoke(serviceContainingPrivateMethod, privateMethodParameterOne, privateMethodParameterTwo).equals(null));

6
  1. প্রতিবিম্ব ব্যবহার করে, পরীক্ষার ক্লাস থেকে ব্যক্তিগত পদ্ধতিগুলি কল করা যেতে পারে। এক্ষেত্রে,

    // পরীক্ষার পদ্ধতিটি এরকম হবে ...

    public class TestA {
    
      @Test
        public void testMethod() {
    
        A a= new A();
        Method privateMethod = A.class.getDeclaredMethod("method1", null);
        privateMethod.setAccessible(true);
        // invoke the private method for test
        privateMethod.invoke(A, null);
    
        }
    }
  2. যদি ব্যক্তিগত পদ্ধতিটি অন্য কোনও বেসরকারী পদ্ধতিকে কল করে, তবে আমাদের অবজেক্টটি গুপ্তচর করতে হবে এবং অন্য পদ্ধতিটি আটকে রাখতে হবে test পরীক্ষার শ্রেণিটি এমন হবে ...

    // পরীক্ষার পদ্ধতিটি এরকম হবে ...

    public class TestA {
    
      @Test
        public void testMethod() {
    
        A a= new A();
        A spyA = spy(a);
        Method privateMethod = A.class.getDeclaredMethod("method1", null);
        privateMethod.setAccessible(true);
        doReturn("Test").when(spyA, "method2"); // if private method2 is returning string data
        // invoke the private method for test
        privateMethod.invoke(spyA , null);
    
        }
    }

** পদ্ধতির প্রতিফলন এবং গুপ্তচরবৃত্তি একত্রিত হয়। ** মেথড 1 এবং ** মেথড 2 হ'ল ব্যক্তিগত পদ্ধতি এবং মেথড 1 কল মেথড 2।


4

আপনার ব্যক্তিগত পদ্ধতিটি পরীক্ষা করার প্রয়োজনটি আমি সত্যিই বুঝতে পারি না। মূল সমস্যাটি হ'ল আপনার সর্বজনীন পদ্ধতিটি রিটার্নের ধরণ হিসাবে বাতিল, এবং তাই আপনি আপনার সর্বজনীন পদ্ধতি পরীক্ষা করতে সক্ষম নন। অতএব আপনি আপনার ব্যক্তিগত পদ্ধতি পরীক্ষা করতে বাধ্য হন। আমার অনুমান কি ঠিক ??

কয়েকটি সম্ভাব্য সমাধান (এএফাইক):

  1. আপনার ব্যক্তিগত পদ্ধতিগুলিকে উপহাস করা হচ্ছে, কিন্তু তবুও আপনি আপনার পদ্ধতির "প্রকৃতপক্ষে" পরীক্ষা করবেন না।

  2. পদ্ধতিতে ব্যবহৃত বস্তুর অবস্থা যাচাই করুন। বেশিরভাগ পদ্ধতি হয় হয় ইনপুট মানগুলির কিছু প্রক্রিয়াকরণ করে এবং একটি আউটপুট ফেরত দেয়, বা বস্তুর স্থিতি পরিবর্তন করে। পছন্দসই রাষ্ট্রের জন্য বস্তুগুলির পরীক্ষা করাও নিযুক্ত করা যেতে পারে।

    public class A{
    
    SomeClass classObj = null;
    
    public void publicMethod(){
       privateMethod();
    }
    
    private void privateMethod(){
         classObj = new SomeClass();
    }
    
    }

    [এখানে আপনি বেসরাল পদ্ধতিতে পরীক্ষা করতে পারবেন, ক্লাসঅবজে রাজ্যের পরিবর্তনটি শূন্য থেকে নাল না করে পরীক্ষা করে by]

  3. আপনার কোডটি কিছুটা রিফ্যাক্ট করুন (আশা করি এটি কোনও উত্তরাধিকারের কোড নয়)। আমার পদ্ধতি লেখার ফান্ডাটি হ'ল, সর্বদা কোনও কিছু ফেরত দেওয়া উচিত (একটি প্রারম্ভিক / বুলিয়ান)। প্রত্যাবর্তিত মান হতে পারে বা বাস্তবায়নের দ্বারা ব্যবহৃত হতে পারে না, তবে এটি পরীক্ষার মাধ্যমে অবশ্যই ব্যবহার করা হবে

    কোড।

    public class A
    { 
        public int method(boolean b)
        {
              int nReturn = 0;
              if (b == true)
                   nReturn = method1();
              else
                   nReturn = method2();
        }
    
        private int method1() {}
    
        private int method2() {}
    
    }

3

মকিতো সহ কোনও প্রাইভেট সদস্যের কাছ থেকে পদ্ধতিগুলি পরীক্ষা করার উপায় রয়েছে। ধরা যাক আপনার মতো ক্লাস রয়েছে:

public class A {
    private SomeOtherClass someOtherClass;
    A() {
        someOtherClass = new SomeOtherClass();
    }
    public void method(boolean b){
        if (b == true)
            someOtherClass.method1();
        else
            someOtherClass.method2();
    }

}

public class SomeOtherClass {
    public void method1() {}
    public void method2() {}
}

আপনি যদি পরীক্ষা করতে চান a.methodতবে একটি পদ্ধতি চাওয়া হবে SomeOtherClass, আপনি নীচের মতো কিছু লিখতে পারেন।

@Test
public void testPrivateMemberMethodCalled() {
    A a = new A();
    SomeOtherClass someOtherClass = Mockito.spy(new SomeOtherClass());
    ReflectionTestUtils.setField( a, "someOtherClass", someOtherClass);
    a.method( true );

    Mockito.verify( someOtherClass, Mockito.times( 1 ) ).method1();
}

ReflectionTestUtils.setField(); আপনি গুপ্তচর করতে পারেন এমন কিছু দিয়ে ব্যক্তিগত সদস্যকে স্ট্যাঙ্ক করবে।


2

আপনার পরীক্ষাকে একই প্যাকেজে রাখুন, তবে একটি ভিন্ন উত্স ফোল্ডার (src / main / java বনাম src / test / java) দিন এবং সেই পদ্ধতিগুলি প্যাকেজ-ব্যক্তিগত করুন। ইমো টেস্টাবিলিটি গোপনীয়তার চেয়ে গুরুত্বপূর্ণ।


6
একমাত্র বৈধ কারণ হ'ল উত্তরাধিকার ব্যবস্থার একটি অংশ পরীক্ষা করা। আপনি যদি ব্যক্তিগত / প্যাকেজ-বেসরকারী পদ্ধতি পরীক্ষা করতে শুরু করেন তবে আপনি আপনার অবজেক্টের অভ্যন্তরীণতা প্রকাশ করবেন। এটি করার ফলে সাধারণত খারাপ দুর্যোগযোগ্য কোড হয়। কম্পোজিশন পছন্দ করুন যাতে আপনি কোনও অবজেক্ট অরিয়েন্টেড সিস্টেমের সমস্ত সদ্ব্যবহার সহকারে টেস্টিবিলিটি অর্জন করতে পারেন।
ব্রাইস

1
সম্মত - এটি পছন্দসই উপায়। তবে, যদি আপনি প্রকৃতপক্ষে মকিতো দিয়ে ব্যক্তিগত পদ্ধতিগুলি পরীক্ষা করতে চান তবে এটি আপনার কাছে কেবল (টাইপসেফ) বিকল্প। আমার উত্তরটি যদিও কিছুটা তাড়াহুড়ো ছিল তবে আমার এবং আপনারা এবং অন্যান্যরা যেমন করেছেন, তেমন ঝুঁকিগুলিও উল্লেখ করা উচিত ছিল।
রোল্যান্ড স্নাইডার

এটি আমার পছন্দের উপায়। প্যাকেজ-প্রাইভেট স্তরে অবজেক্টের অভ্যন্তরীণ বহিঃস্থাপিত করার কোনও ভুল নেই; এবং ইউনিট পরীক্ষা হোয়াইট-বক্স টেস্টিং, আপনাকে পরীক্ষার জন্য অভ্যন্তরীণটি জানতে হবে।
অ্যান্ড্রু ফেং

0

যে ক্ষেত্রে বেসরকারী পদ্ধতিটি বাতিল নয় এবং রিটার্ন মান কোনও বাহ্যিক নির্ভরতার পদ্ধতির পরামিতি হিসাবে ব্যবহৃত হয়, আপনি নির্ভরতাটিকে উপহাস ArgumentCaptorকরতে পারেন এবং রিটার্ন মানটি ক্যাপচার করতে ব্যবহার করতে পারেন। উদাহরণ স্বরূপ:

ArgumentCaptor<ByteArrayOutputStream> csvOutputCaptor = ArgumentCaptor.forClass(ByteArrayOutputStream.class);
//Do your thing..
verify(this.awsService).uploadFile(csvOutputCaptor.capture());
....
assertEquals(csvOutputCaptor.getValue().toString(), "blabla");
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.