@ রুনউইথ (মকিতোজুনিটরুনার.ক্লাস) বনাম মকিতোঅনোটেশন.ইনটমকস (এটি)


118

একটি নতুন jUnit4 পরীক্ষা লেখার সময়, আমি @RunWith (MockitoJUnitRunner.class) বা MockitoAnnotations.initMocks (এটি) ব্যবহার করবেন কিনা তা ভাবছি ।

আমি একটি নতুন পরীক্ষা তৈরি করেছি এবং উইজার্ডটি স্বয়ংক্রিয়ভাবে রানারের সাহায্যে একটি পরীক্ষা তৈরি করেছে। মকিতোজেট ইউনাইটরানারের জন্য জাভাদোকগুলি নিম্নলিখিতটি জানিয়েছে:

JUnit 4.4 এবং উচ্চতর সঙ্গে সামঞ্জস্যপূর্ণ, এই রানার নিম্নলিখিত আচরণ যুক্ত করে:

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

আমি অতীতে যে ধরণের initMocks () পদ্ধতি ব্যবহার করেছিলাম তার চেয়ে রানার ব্যবহারের কোনও সুবিধা আছে কিনা তা আমার কাছে স্পষ্ট নয় ।

কোন চিন্তা বা লিঙ্ক প্রশংসা করা হবে!

উত্তর:


147

MockitoJUnitRunnerআপনাকে ফ্রেমওয়ার্ক ব্যবহারের স্বয়ংক্রিয় বৈধতা দেওয়ার পাশাপাশি একটি স্বয়ংক্রিয়ভাবে দেয় initMocks()

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

  • আপনি স্ট্যাটিক কল whenপদ্ধতি, কিন্তু একটি ম্যাচিং সঙ্গে stubbing শেষ না করেন thenReturn, thenThrowবা then(নীচের কোডে ত্রুটি 1)

  • আপনি verifyএকটি উপহাসের আহ্বান জানিয়েছেন, তবে যে পদ্ধতি কলটি যাচাই করার চেষ্টা করছেন তা সরবরাহ করতে ভুলবেন না। (নীচের কোডে ত্রুটি 2)

  • আপনি whenপরে পদ্ধতিটি কল করেন doReturn, doThrowবা doAnswerএকটি মক পাস, কিন্তু আপনি যে পদ্ধতিতে ঝাঁকুনির চেষ্টা করছেন সেটি প্রদান করতে ভুলে যান। (নীচের কোডে ত্রুটি 3)

যদি আপনার কাঠামোর ব্যবহারের বৈধতা না থাকে তবে নিম্নলিখিত ভুলগুলি মকিতো পদ্ধতিতে কল না করা পর্যন্ত এই ভুলগুলি জানানো হয় না । এটি হতে পারে

  • একই পরীক্ষা পদ্ধতিতে (নীচে ত্রুটি 1 এর মতো),
  • পরবর্তী পরীক্ষা পদ্ধতিতে (নীচে ত্রুটি 2 এর মতো),
  • পরবর্তী পরীক্ষা ক্লাসে।

আপনার চালিত সর্বশেষ পরীক্ষায় যদি এগুলি ঘটে থাকে (নীচে ত্রুটির মতো 3) তবে এগুলি মোটেও জানানো হবে না।

এই ধরণের ত্রুটিগুলির প্রতিটি দেখতে কেমন তা এখানে রয়েছে। অনুমান করুন যে এখানে ইউনিত এই তালিকাগুলি তালিকাবদ্ধভাবে চালিয়েছে runs

@Test
public void test1() {

    // ERROR 1
    // This compiles and runs, but it's an invalid use of the framework because 
    // Mockito is still waiting to find out what it should do when myMethod is called.
    // But Mockito can't report it yet, because the call to thenReturn might 
    // be yet to happen.
    when(myMock.method1());

    doSomeTestingStuff();

    // ERROR 1 is reported on the following line, even though it's not the line with
    // the error.
    verify(myMock).method2();

}

@Test
public void test2() {

    doSomeTestingStuff();

    // ERROR 2
    // This compiles and runs, but it's an invalid use of the framework because
    // Mockito doesn't know what method call to verify.  But Mockito can't report 
    // it yet, because the call to the method that's being verified might 
    // be yet to happen.
    verify(myMock);
}

@Test
public void test3() {

    // ERROR 2 is reported on the following line, even though it's not even in 
    // the same test as the error.
    doReturn("Hello").when(myMock).method1();


    // ERROR 3
    // This compiles and runs, but it's an invalid use of the framework because
    // Mockito doesn't know what method call is being stubbed.  But Mockito can't 
    // report it yet, because the call to the method that's being stubbed might 
    // be yet to happen.

    doReturn("World").when(myMock);

    doSomeTestingStuff(); 

    //  ERROR 3 is never reported, because there are no more Mockito calls. 
}

এখন যখন আমি এই উত্তরটি পাঁচ বছরেরও বেশি সময় আগে লিখেছিলাম, তখন আমি লিখেছিলাম

সুতরাং আমি MockitoJUnitRunnerযেখানেই সম্ভব ব্যবহারের পরামর্শ দেব । যাইহোক, টমাসজ নুরকিউইচস সঠিকভাবে উল্লেখ করেছেন, আপনার যদি অন্য একটি ইউনাইট রানার যেমন স্প্রিংয়ের প্রয়োজন হয় তবে আপনি এটি ব্যবহার করতে পারবেন না।

আমার সুপারিশ এখন পরিবর্তন হয়েছে। আমি প্রথম এই উত্তরটি লেখার পর থেকে মকিতো টিম একটি নতুন বৈশিষ্ট্য যুক্ত করেছে। এটি একটি JUnit বিধি, যা ঠিক একই ফাংশন সম্পাদন করে MockitoJUnitRunner। তবে এটি আরও ভাল, কারণ এটি অন্যান্য রানারদের ব্যবহারকে বিরত রাখে না।

অন্তর্ভুক্ত করা

@Rule 
public MockitoRule rule = MockitoJUnit.rule();

আপনার পরীক্ষা ক্লাসে। এটি উপহাসকে সূচনা করে এবং কাঠামোর বৈধতা স্বয়ংক্রিয় করে তোলে; ঠিক যেমন MockitoJUnitRunnerকরে। তবে এখন, আপনি SpringJUnit4ClassRunnerবা অন্য কোনও JUnitRunner ব্যবহার করতে পারেন । মকিতো ২.১.০ এর পরে, এমন অতিরিক্ত বিকল্প রয়েছে যা ঠিক কী ধরণের সমস্যাগুলি রিপোর্ট হতে পারে তা নিয়ন্ত্রণ করে।


আমি অবশ্যই বলতে পারি না যে তারা একই রকম। একটি পরীক্ষার ক্ষেত্রে, জুনিট রানার সেটআপটি আমার জন্য ব্যর্থ হয় এবং আমি যদি মিক্স সেটআপ না করি তবে আমার মককে সঠিকভাবে ইনজেকশন দেয় না
dtc

আমরা টেস্টং 8.৮.৮ + মকিতো ১.১০.১৯ ব্যবহার করছি এবং স্পষ্টতই আমরা মকিতোজেউনিটর্নার ব্যবহার করতে পারি না, তবে বৈধকরণের কাঠামোটি এখনও কার্যকর! এবং এটি ঠিক ডেভিড ওয়ালেসের মতো কাজ করে। কেউ কি ব্যাখ্যা করতে পারেন? এটি কি কারণ আমাদের এখনও @ কলব্যাকস এবং মকিতোঅনোটেশন.ইনটমকস (এটি) আগে?
yuranos

@ yuranos87 এমন একটি শব্দ মনে হচ্ছে আপনার নতুন প্রশ্ন হিসাবে জিজ্ঞাসা করা উচিত। আপনি যখন করবেন তখন আপনার কোডটি অন্তর্ভুক্ত করতে ভুলবেন না - আপনি কোডটি না দেখালে "এই কোডটি XYZ কেন করে" তা জিজ্ঞাসা করা কিছুটা অর্থহীন।
দাউদ ইবনে কারিম

1
টেস্টরুনার সলিউশনটি ব্যবহার করে @ বিধিটিকে অনেকদূর ছাড়িয়ে যায়
বিধি ২

1
@alexandroid আমার সেরা পরামর্শ হ'ল আপনার নিজের উত্তর লিখতে, ব্যবহার করে @ExtendWith। এটি আসলে আমি জানার মতো কিছু নয়। স্ট্যাক ওভারফ্লো সম্পর্কে দুর্দান্ত জিনিসটি হ'ল এই জাতীয় প্রশ্নে আপনি একাধিক সঠিক উত্তর দিয়ে শেষ করতে পারেন।
দাউদ ইবনে কেরেম

24

রানার ব্যবহার করে আপনি কিছুটা কোডিং ( @Beforeপদ্ধতির প্রয়োজন নেই ) সংরক্ষণ করতে পারবেন । অন্যদিকে রানার ব্যবহার কখনও কখনও সম্ভব হয় না, যেমন আপনি যখন ইতিমধ্যে একটি ব্যবহার করছেন, পছন্দ করুন SpringJUnit4ClassRunner

এটাই. এটি কেবল পছন্দের বিষয়।


2
InitMocks () লাইন বাদে অন্য যে কোনও সেটআপের জন্য @ পূর্বের পদ্ধতিটির এখনও দরকার হবে, তাই না?
ওশান ব্লু

2
@ ওশান ব্লু: অবশ্যই যদি আপনার @Beforeপদ্ধতিতে initMocks()রানার স্থানান্তরের পরে এটি সংরক্ষণ করা ব্যতীত অন্য কিছু থাকে ।
টমাসজ নুরকিউইচজ

ফ্রেমওয়ার্কের বৈধতা সম্পর্কে ডেভিড ওয়ালেসের উত্তর আমার প্রশ্নের সম্পূর্ণরূপে জবাব দেয় তাই আমি সেটিকে মেনে নিয়েছি, তবে এই রানারটি স্প্রিংয়ের মতো অন্য একজনের সাথে ব্যবহার করা যাবে না তা নির্দেশ করার জন্য। ধন্যবাদ!
ওশান ব্লু

1
আমি স্প্রিং বুট ব্যবহার করছি এবং আমি বলতে পারি যে SpringJUnit4ClassRunnerস্বয়ংক্রিয়ভাবে আমার জন্য উপহাস শুরু করে। যদিও আমি সরল স্প্রিং সম্পর্কে জানি না।
গুস্তাভোহেঙ্কে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.