মকিতোতে অসম্পূর্ণ স্টুবিং সনাক্ত হয়েছে


151

পরীক্ষা চালানোর সময় আমি নিম্নলিখিত ব্যতিক্রম পাচ্ছি। আমি উপহাসের জন্য মকিতো ব্যবহার করছি। মকিতো গ্রন্থাগার দ্বারা উল্লিখিত ইঙ্গিতগুলি সহায়তা করছে না।

org.mockito.exceptions.misusing.UnfinishedStubbingException: 
Unfinished stubbing detected here:
    -> at com.a.b.DomainTestFactory.myTest(DomainTestFactory.java:355)

    E.g. thenReturn() may be missing.
    Examples of correct stubbing:
        when(mock.isOk()).thenReturn(true);
        when(mock.isOk()).thenThrow(exception);
        doThrow(exception).when(mock).someVoidMethod();
    Hints:
     1. missing thenReturn()
     2. you are trying to stub a final method, you naughty developer!

        at a.b.DomainTestFactory.myTest(DomainTestFactory.java:276)
        ..........

থেকে পরীক্ষার কোড DomainTestFactory। আমি যখন নিম্নলিখিত পরীক্ষাটি চালাই, তখন আমি ব্যতিক্রমটি দেখি।

@Test
public myTest(){
    MyMainModel mainModel =  Mockito.mock(MyMainModel.class);
    Mockito.when(mainModel.getList()).thenReturn(getSomeList()); // Line 355
}

private List<SomeModel> getSomeList() {
    SomeModel model = Mockito.mock(SomeModel.class);
    Mockito.when(model.getName()).thenReturn("SomeName"); // Line 276
    Mockito.when(model.getAddress()).thenReturn("Address");
    return Arrays.asList(model);
}

public class SomeModel extends SomeInputModel{
    protected String address;
    protected List<SomeClass> properties;

    public SomeModel() {
        this.Properties = new java.util.ArrayList<SomeClass>(); 
    }

    public String getAddress() {
        return this.address;
    }

}

public class SomeInputModel{

    public NetworkInputModel() {
        this.Properties = new java.util.ArrayList<SomeClass>(); 
    }

    protected String Name;
    protected List<SomeClass> properties;

    public String getName() {
        return this.Name;
    }

    public void setName(String value) {
        this.Name = value;
    }
}

হাই মুরিনিক, আমি লাইন নম্বর সহ পোস্টটি আপডেট করেছি
রয়েল রোজ

উত্তর:


371

আপনি ঠাট্টা-বিদ্রূপের ভিতরে বাসা বাঁধছেন। আপনি তাদের কল করছেন getSomeList(), যা থেকে কয়েকজন টিটকারী করে, আগে আপনি ব্যঙ্গ সমাপ্ত করেছি MyMainModel। আপনি যখন এটি করবেন তখন মকিতো পছন্দ করবেন না।

প্রতিস্থাপন করা

@Test
public myTest(){
    MyMainModel mainModel =  Mockito.mock(MyMainModel.class);
    Mockito.when(mainModel.getList()).thenReturn(getSomeList()); --> Line 355
}

সঙ্গে

@Test
public myTest(){
    MyMainModel mainModel =  Mockito.mock(MyMainModel.class);
    List<SomeModel> someModelList = getSomeList();
    Mockito.when(mainModel.getList()).thenReturn(someModelList);
}

এটি কেন সমস্যার সৃষ্টি করে তা বোঝার জন্য, মকিতো কীভাবে কাজ করে সে সম্পর্কে আপনাকে কিছুটা জানতে হবে এবং জাভাতে কোন ক্রমবিন্যাস এবং বিবৃতিগুলি মূল্যায়ন করা হয় সে সম্পর্কেও আপনাকে সচেতন থাকতে হবে।

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

লাইন

Mockito.when(mainModel.getList()).thenReturn(someModelList);

মকিতোর সাথে নিম্নলিখিত কথোপকথনের কারণ ঘটায়:

  • মোক পদ্ধতি mainModel.getList()বলা হয়,
  • স্ট্যাটিক পদ্ধতি whenবলা হয়,
  • পদ্ধতির দ্বারা প্রত্যাবর্তিত বস্তুর thenReturnউপর পদ্ধতিটি কল করা হয়।OngoingStubbingwhen

thenReturnপদ্ধতি তারপর উপহাস এটা মাধ্যমে গৃহীত নির্দেশ করতে OngoingStubbingপদ্ধতি কোনো উপযুক্ত কল হ্যান্ডেল করতে getListরিটার্ন পদ্ধতি someModelList

প্রকৃতপক্ষে, যেমন মকিতো আপনার কোডটি দেখতে পাচ্ছে না, আপনি নিজের বিদ্রূপটিও নীচে লিখতে পারেন:

mainModel.getList();
Mockito.when((List<SomeModel>)null).thenReturn(someModelList);

এই শৈলীটি পড়ার জন্য কিছুটা কম স্পষ্ট, বিশেষত যেহেতু এই ক্ষেত্রে ক্ষেত্রে nullকাস্ট করতে হবে তবে এটি মকিতোর সাথে একই রকম ক্রিয়াকলাপ তৈরি করে এবং উপরের লাইনের মতো একই ফলাফল অর্জন করবে।

তবে, লাইন

Mockito.when(mainModel.getList()).thenReturn(getSomeList());

মকিতোর সাথে নিম্নলিখিত কথোপকথনের কারণ ঘটায়:

  1. মোক পদ্ধতি mainModel.getList()বলা হয়,
  2. স্ট্যাটিক পদ্ধতি whenবলা হয়,
  3. একটি নতুন mockএর SomeModelতৈরি করা হয় (অভ্যন্তরীণ getSomeList()),
  4. মোক পদ্ধতি model.getName()বলা হয়,

এই মুহুর্তে মকিতো বিভ্রান্ত হয়। মনে হয়েছিল আপনি ঠাট্টা করছেন mainModel.getList(), কিন্তু এখন আপনি এটি বলছেন আপনি model.getName()পদ্ধতিটি উপহাস করতে চান । মকিতোর কাছে দেখে মনে হচ্ছে আপনি নিম্নলিখিতটি করছেন:

when(mainModel.getList());
// ...
when(model.getName()).thenReturn(...);

এটি নির্বাক দেখাচ্ছে Mockitoকারণ এটি আপনি কী করছেন তা নিশ্চিত হতে পারে না mainModel.getList()

নোট করুন যে আমরা thenReturnপদ্ধতি কলটিতে যাইনি , কারণ জেভিএমকে পদ্ধতিটি কল করার আগে এই পদ্ধতির পরামিতিগুলি মূল্যায়ন করতে হবে। এই ক্ষেত্রে, এর অর্থ getSomeList()পদ্ধতিটি কল করা ।

সাধারণত মকিতোর মতো স্থিতিশীল অবস্থার উপর নির্ভর করা একটি খারাপ নকশার সিদ্ধান্ত, কারণ এটি এমন ক্ষেত্রে পরিচালিত করতে পারে যেখানে ন্যূনতম বিস্ময়ের নীতি লঙ্ঘিত হয়। যাইহোক, মকিতোর ডিজাইনটি স্পষ্ট এবং উদ্বেগজনক উপহাসের জন্য তৈরি করে, এমনকি এটি কখনও কখনও বিস্ময়ের দিকে পরিচালিত করে।

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

3: আপনি যদি সম্পূর্ণ হয়ে থাকে তবে 'ততক্ষণ' নির্দেশের আগে অন্য উপহাসের অভ্যন্তরে আচরণ বন্ধ করে দিচ্ছেন


এই সত্যের কোন ব্যাখ্যা আছে কি? সমাধান কাজ করে। এবং আমি বুঝতে পারছি না কেন 'ইন-প্লেস' উপহাস তৈরি কাজ করে না। আপনি যখন মক তৈরি করেন এবং তৈরি করা মককে অন্য মোককে রেফারেন্স দিয়ে পাস করেন তখন এটি কার্যকর হয়।
ক্যাপাসিস্ট্রন

1
দুর্দান্ত উত্তর, ভালোবাসি তাই! এটি নিজে নিজে খুঁজে পেতে আমার বয়স হতে হয়েছিল
ডিসি

4
দুর্দান্ত উত্তর লুক! সহজ কথায় খুব বিস্তারিত ব্যাখ্যা। ধন্যবাদ.
টমাসজ কালকোসিস্কি

1
অসাধারণ. মজার বিষয় হ'ল, আমি যখন সরাসরি মেথড কল করি এবং ধীরে ধীরে ডিবাগ করি, তখন এটি কার্যকর হয়। সিজিএলআইবি $ বাউন্ডের অ্যাট্রিবিউটটি মানটি সত্যটি পেয়েছে তবে কোনওভাবে এটি কিছুটা সময় নেয়। আমি যখন সরাসরি পদ্ধতি কলটি ব্যবহার করি এবং প্রশিক্ষণের আগে (যখন ...) থামি, তখন আমি দেখি মানটি প্রথমে মিথ্যা, এবং পরে সত্য হয়ে যায়। যখন এটি মিথ্যা হয় এবং প্রশিক্ষণ শুরু হয়, তখন এই ব্যতিক্রম ঘটে occ
মাইকেল হেগনার

আপনি আমার দিন তৈরি! এটি এমন ধরণের ত্রুটি যা আপনাকে প্রচুর সময় নষ্ট করে দেয়! আমি ভেবেছিলাম এটা শুরুতে kotlin এর সাথে সম্পর্কিত কিছু ছিল
ব্রঙ্কস

1
org.mockito.exceptions.misusing.UnfinishedStubbingException: 
Unfinished stubbing detected here:
E.g. thenReturn() may be missing.

শূন্য পদ্ধতিগুলির উপহাস করার জন্য নীচে চেষ্টা করুন:

//Kotlin Syntax

 Mockito.`when`(voidMethodCall())
           .then {
                Unit //Do Nothing
            }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.