যুক্তি বিবেচনা না করে মকিতো কোনও পদ্ধতিতে স্ট্যাব করতে পারে?


302

আমি মকিতো ব্যবহার করে কিছু উত্তরাধিকার কোড পরীক্ষা করার চেষ্টা করছি।

আমি নীচে FooDaoহিসাবে উত্পাদনে ব্যবহৃত হয় যে স্টাব করতে চাই :

foo = fooDao.getBar(new Bazoo());

আমি লিখতে পারি:

when(fooDao.getBar(new Bazoo())).thenReturn(myFoo);

তবে সুস্পষ্ট সমস্যাটি হ'ল আমি getBar()সেই একই Bazooবস্তুর সাথে কখনই ডাকি না যেটির জন্য আমি পদ্ধতিটি স্তম্ভিত করেছিলাম। ( newঅপারেটরকে অভিশাপ দিন !)

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

উত্তর:


456
when(
  fooDao.getBar(
    any(Bazoo.class)
  )
).thenReturn(myFoo);

বা ( nullগুলি এড়ানোর জন্য ):

when(
  fooDao.getBar(
    (Bazoo)notNull()
  )
).thenReturn(myFoo);

ম্যাথারগুলি আমদানি করতে ভুলবেন না (আরও অনেকগুলি উপলভ্য রয়েছে):

মকিতো ২.১.০ এবং আরও নতুনদের জন্য:

import static org.mockito.ArgumentMatchers.*;

পুরানো সংস্করণগুলির জন্য:

import static org.mockito.Matchers.*;

2
আমি উত্তরটি যখন 'উত্তর উত্তর স্থির করে নিন' এর শেষ হওয়ার আগে পছন্দ করি love
এরিক উইলসন

10
এর notNull(Bazoo.class)মতোই রয়েছে any(Bazoo.class)(সম্ভবত এই উত্তরের সময় এটি উপস্থিত ছিল না)
ডান্ড্রে অ্যালিসন

2
আমার কিছুটা বিশেষ পরিস্থিতি ছিল যেখানে আমার দুটি সম্ভাব্য যুক্তি হতে পারে - Bazooবা Cazooযা উভয়ই সাবক্লাস, বলে Azoo। জন্য Bazooআমি ফিরে প্রয়োজন foo, কিন্তু জন্য Cazooআমি ফিরে প্রয়োজন bar। এই পরিস্থিতিতে প্রস্তাবিত Matchers.any()সমাধান কাজ করে না, তবে Matchers.isA()নিখুঁত কাজ করে।
তানভীর

3
org.mockito.Matchersএখন org.mockito.ArgumentMatchersimport static org.mockito.ArgumentMatchers.*
অবচয় করা

when(myFoo.knowsWhatsUp()).thenReturn(myMoney);
6rchid

18

এটি ব্যবহার করুন:

when(
  fooDao.getBar(
    Matchers.<Bazoo>any()
  )
).thenReturn(myFoo);

আপনার আমদানি করা দরকার আগে Mockito.Matchers


1
এই চিত্রিত হয়!
DrB

15

http://site.mockito.org/mockito/docs/1.10.19/org/mockito/Matchers.html

anyObject() আপনার প্রয়োজন মাপসই করা উচিত

এছাড়াও, আপনি সর্বদা বাস্তবায়ন বিবেচনা করতে পারেন hashCode()এবংequals()Bazoo শ্রেণীর জন্য । এটি আপনার কোড উদাহরণটি আপনার পছন্দ মতো কাজ করবে।


দ্বিতীয় পরামর্শের সাথে একমত হয়েছি, তবে আমি এখনও প্রযুক্তিগত কারণে তা না করার পছন্দ করছি।
এরিক উইলসন

1
ম্যাচার্স ক্লাসটি অবহেলা করা হয়েছে ( দস্তাবেজগুলি দেখুন - "এই শ্রেণিটি সম্ভবত 3.0 সংস্করণে সরানো হবে" )
জোহানেস রাবাউর

1

আরেকটি বিকল্প হ'ল ভাল পুরানো ফ্যাশন equalsপদ্ধতির উপর নির্ভর করা । দীর্ঘ আর্গুমেন্ট হিসাবে হিসাবে whenউপহাসequals মধ্যে যুক্তি কোডটিতে যুক্তিটি পরীক্ষা করা হচ্ছে, ততক্ষণ মকিতো সেই মকের সাথে মিলবে।

এখানে একটি উদাহরণ।

public class MyPojo {

    public MyPojo( String someField ) {
        this.someField = someField;
    }

    private String someField;

    @Override
    public boolean equals( Object o ) {
        if ( this == o ) return true;
        if ( o == null || getClass() != o.getClass() ) return false;
        MyPojo myPojo = ( MyPojo ) o;
        return someField.equals( myPojo.someField );
    }

}

তারপরে, ধরে নিই যে এর মূল্য কী someFieldহবে তা আপনি জেনে গেছেন , আপনি এটি এ জাতীয় উপহাস করতে পারেন।

when(fooDao.getBar(new MyPojo(expectedSomeField))).thenReturn(myFoo);

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

কন: কখনও কখনও ক্ষেত্রটি অবজেক্টে পাস করা হচ্ছে একটি এলোমেলো আইডি। এই ক্ষেত্রে আপনি সহজেই আপনার মক কোডে প্রত্যাশিত আর্গুমেন্ট অবজেক্টটি তৈরি করতে পারবেন না।

আর একটি সম্ভাব্য পন্থা হ'ল মকিতোর Answerবস্তুটি যা whenপদ্ধতিটির সাথে ব্যবহার করা যেতে পারে use Answerআপনাকে আসল কলটি বাধা দিতে এবং ইনপুট আর্গুমেন্টটি পরিদর্শন করতে এবং একটি মক অবজেক্টটি ফিরিয়ে দিতে দেয়। নীচের উদাহরণে আমি anyউপহাসের পদ্ধতিটিতে কোনও অনুরোধ ধরতে ব্যবহার করছি । তবে Answerলাম্বদাতে, আমি আরও বাজো যুক্তিটি পরিদর্শন করতে পারি ... সম্ভবত এটির জন্য একটি সঠিক আইডি পাস হয়েছে তা যাচাই করতে to আমি এটিকে anyনিজেরাই পছন্দ করি যাতে যুক্তিতে কিছুটা পরিদর্শন করা যায়।

    Bar mockBar = //generate mock Bar.

    when(fooDao.getBar(any(Bazo.class))
    .thenAnswer(  ( InvocationOnMock invocationOnMock) -> {
        Bazo actualBazo = invocationOnMock.getArgument( 0 );

        //inspect the actualBazo here and thrw exception if it does not meet your testing requirements.
        return mockBar;
    } );

সুতরাং সর্বোপরি সংক্ষেপে, আমি নির্ভর করতে চাই equals(যেখানে প্রত্যাশিত যুক্তি এবং আসল যুক্তি একে অপরের সমান হওয়া উচিত) এবং যদি সমানগুলি সম্ভব না হয় (আসল যুক্তির অবস্থার পূর্বাভাস দিতে না পারার কারণে), আমি অবলম্বন করব থেকে Answerযুক্তি পরিদর্শন করা।

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