মকিতো দিয়ে চূড়ান্ত শ্রেণিতে কীভাবে উপহাস করবেন


218

আমার একটি ফাইনাল ক্লাস রয়েছে, এরকম কিছু:

public final class RainOnTrees{

   public void startRain(){

        // some code here
   }
}

আমি এই ক্লাসটি অন্য কয়েকটি ক্লাসে এর মতো ব্যবহার করছি:

public class Seasons{

   RainOnTrees rain = new RainOnTrees();

   public void findSeasonAndRain(){

        rain.startRain();

    }
}

এবং আমার JUnit পরীক্ষার ক্লাসে আমি ক্লাসটিকে Seasons.javaউপহাস করতে চাই RainOnTrees। আমি মকিতো দিয়ে এটি কীভাবে করব?


9
মকিতো এটির অনুমতি দেয় না, তবে পাওয়ারমক এটি করে।
fge

1
মকিতো ২.x হিসাবে, মকিতো এখন চূড়ান্ত শ্রেণি এবং পদ্ধতিগুলির উপহাসকে সমর্থন করে।
কেন্ট

উত্তর:


155

চূড়ান্ত / স্ট্যাটিক ক্লাস / পদ্ধতিগুলি মকিতো ভি 2 দিয়েই সম্ভব।

এটি আপনার গ্রেড ফাইলটিতে যুক্ত করুন:

testImplementation 'org.mockito:mockito-inline:2.13.0'

মকিতো ভি 1 এর মাধ্যমে মকিটো এফকিউ থেকে এটি সম্ভব নয় :

মকিতো সীমাবদ্ধতা কি

  • জাভা 1.5+ প্রয়োজন

  • চূড়ান্ত ক্লাসগুলি উপহাস করা যায় না

...


2
এটি স্কালায় আমার পক্ষে কাজ করেনি (এসবিটি পরিবর্তন সহ)।
micseydel

2
এটি আমার পক্ষে যথেষ্ট ছিল না। আমাকে এসসিআর / টেস্ট / রিসোর্স / মকিতো-এক্সটেনশানস / org.mockito.plugins.MockMaker এর মধ্যে "মক-মেকার-ইনলাইন" সহ baeldung.com / মকিতো- ফাইনাল
মাইক্রোসডেল

204

মকিতো 2 এখন চূড়ান্ত ক্লাস এবং পদ্ধতিগুলি সমর্থন করে!

তবে আপাতত এটি একটি "ইনকিউবেটিং" বৈশিষ্ট্য। এটি সক্রিয় করতে কিছু পদক্ষেপ প্রয়োজন যা মকিতো 2 এ নতুন কী বর্ণিত হয়েছে :

চূড়ান্ত ক্লাস এবং পদ্ধতিগুলির উপহাস করা একটি ইনকিউবিটিং , অপ্ট-ইন বৈশিষ্ট্য। এটি জাভা এজেন্ট উপকরণ এবং সাবক্লাসিংয়ের সংমিশ্রণ ব্যবহার করে যাতে এই ধরণের বিদ্রূপযোগ্যতা সক্ষম হয়। যেহেতু এটি আমাদের বর্তমান ব্যবস্থায় আলাদাভাবে কাজ করে এবং এর একটির বিভিন্ন সীমাবদ্ধতা রয়েছে এবং আমরা অভিজ্ঞতা এবং ব্যবহারকারীর প্রতিক্রিয়া সংগ্রহ করতে চাইলে এই বৈশিষ্ট্যটি স্পষ্টভাবে সক্রিয় করতে হবে; এটি src/test/resources/mockito-extensions/org.mockito.plugins.MockMakerএকক লাইনযুক্ত ফাইল তৈরি করে মকিটো এক্সটেনশন প্রক্রিয়াটির মাধ্যমে করা যেতে পারে :

mock-maker-inline

আপনি এই ফাইলটি তৈরি করার পরে, মকিতো স্বয়ংক্রিয়ভাবে এই নতুন ইঞ্জিনটি ব্যবহার করবে এবং একটি এটি করতে পারে:

 final class FinalClass {
   final String finalMethod() { return "something"; }
 }

 FinalClass concrete = new FinalClass(); 

 FinalClass mock = mock(FinalClass.class);
 given(mock.finalMethod()).willReturn("not anymore");

 assertThat(mock.finalMethod()).isNotEqualTo(concrete.finalMethod());

পরবর্তী মাইলফলকগুলিতে, দলটি এই বৈশিষ্ট্যটি ব্যবহারের একটি প্রোগ্রামিক পদ্ধতি নিয়ে আসবে। আমরা সমস্ত অচলাচল পরিস্থিতি সনাক্ত করতে এবং সহায়তা সরবরাহ করব। সাথে থাকুন এবং দয়া করে আমাদের এই বৈশিষ্ট্যটি সম্পর্কে কী ধারণা দিন তা আমাদের জানান!


14
আমি এখনও একটি ত্রুটি পেয়েছি: উপহাস / গুপ্তচর শ্রেণি অ্যান্ড্রয়েড কনটেন্ট করতে পারি না
omp কম্পোনেন্টনাম মকিতো

3
আপনি org.mockito.plugins.MockMakerফাইলটি সঠিক ফোল্ডারে রেখেছেন তা নিশ্চিত করুন ।
উইন্ডারাইডার

7
উপরোক্ত বর্ণনার পরেও আমি ত্রুটিটি পাচ্ছি: মকিতো উপহাস / গুপ্তচর করতে পারে না কারণ: - চূড়ান্ত শ্রেণি
rcde0

8
@vCillusion এই উত্তরটি কোনওভাবেই পাওয়ারমকের সাথে সম্পর্কিত নয়।
লাইনে

6
আমি এই নির্দেশাবলী অনুসরণ করেছিলাম কিন্তু আমি এখনও এই কাজটি করতে পারি না, কারও কি অন্য কিছু করার ছিল?
ফ্রাঙ্কো

43

আপনি মকিতো দিয়ে একটি চূড়ান্ত শ্রেণিকে উপহাস করতে পারবেন না, কারণ আপনি নিজের দ্বারা এটি করতে পারবেন না।

আমি যা করি তা হ'ল চূড়ান্ত শ্রেণিকে মোড়ানোর জন্য একটি চূড়ান্ত চূড়ান্ত শ্রেণি তৈরি করা এবং প্রতিনিধি হিসাবে ব্যবহার করা। এর উদাহরণ TwitterFactoryবর্গ, এবং এটি আমার বিদ্রূপযোগ্য শ্রেণি:

public class TwitterFactory {

    private final twitter4j.TwitterFactory factory;

    public TwitterFactory() {
        factory = new twitter4j.TwitterFactory();
    }

    public Twitter getInstance(User user) {
        return factory.getInstance(accessToken(user));
    }

    private AccessToken accessToken(User user) {
        return new AccessToken(user.getAccessToken(), user.getAccessTokenSecret());
    }

    public Twitter getInstance() {
        return factory.getInstance();
    }
}

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

আপনার ক্ষেত্রে আমি একটি চূড়ান্ত RainOnTreesক্লাস তৈরি করব যা চূড়ান্ত শ্রেণিতে প্রতিনিধি। অথবা, আপনি যদি এটি চূড়ান্তভাবে করতে পারেন তবে এটি আরও ভাল।


6
+1 টি। যদি ইচ্ছা হয়, আপনি @Delegateপ্রচুর বয়লারপ্লেট পরিচালনা করতে লম্বোকের মতো কিছু ব্যবহার করতে পারেন ।
রুখ

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

31

এটি আপনার গ্রেড ফাইলটিতে যুক্ত করুন:

testImplementation 'org.mockito:mockito-inline:2.13.0'

এটি চূড়ান্ত শ্রেণীর সাথে মোকিটো কাজ করার কনফিগারেশন


1
সম্ভবত এখন "testCompile" এর পরিবর্তে "testImplementation" ব্যবহার করা উচিত। গ্রেডল "টেস্টকম্পাইল" আর পছন্দ করে না।
জোহরেল

দুর্দান্ত মন্তব্য, ধন্যবাদ! পরীক্ষায় সম্পাদিত আসল মন্তব্য: টেস্টকোম্পাইল 'org.mockito: মকিতো-ইনলাইন: 2.13.0'
বেনিপি

2
লিনাক্স / ওপেনজেডকে 1.8 এ চলার সময় এই ত্রুটির org.mockito.exceptions.base.MockitoInitializationException: Could not initialize inline Byte Buddy mock maker. (This mock maker is not supported on Android.)
ফলস্বরূপ

ওরাকল
জেডিকে

23

পাওয়ারমক ব্যবহার করুন। এই লিঙ্কটি দেখায়, কীভাবে এটি করবেন: https://github.com/jayway/powermock/wiki/MockFinal


30
আমি মনে করি পাওয়ারমক ওষুধের সেই টুকরোগুলির একটির মতো যা কেবলমাত্র "প্রেসক্রিপশন" বেসে বের হওয়া উচিত। এই অর্থে: একটি এটিকে খুব স্পষ্ট করে বলা উচিত যে পাওয়ারমকটিতে প্রচুর সমস্যা রয়েছে; এবং এটি ব্যবহার করা চূড়ান্ত শেষ রিসোর্টের মতো; এবং যতটা সম্ভব এড়ানো উচিত।
ঘোস্টটিক

1
তুমি কেন এটা বললে?
প্রগমেটিক প্রোগ্রামার

আমি Powermockআনুষ্ঠানিকভাবে পরীক্ষা করা আমার কভারেজ বাড়ানোর জন্য চূড়ান্ত ক্লাস এবং স্থির পদ্ধতিগুলির উপহাস করার জন্য ব্যবহার করছিলাম Sonarqube। সোনারকিউবের পরে কভারেজ 0% ছিল, যে কারণে কোথাও এর ভিতরে কোথাও পাওয়ারমক ব্যবহার করা ক্লাসগুলি স্বীকৃতি দেয় না। অনলাইনে কিছু থ্রেড থেকে তা উপলব্ধি করতে আমি এবং আমার দলকে বেশ কিছুটা সময় নিয়েছি। সুতরাং এটি পাওয়ারমকের সাথে সাবধান হওয়ার একটি কারণ এবং সম্ভবত এটি ব্যবহার করবেন না।
আমেরিকান

16

শুধু অনুসরণ করা। আপনার গ্রেড ফাইলটিতে এই লাইনটি যুক্ত করুন:

testCompile group: 'org.mockito', name: 'mockito-inline', version: '2.8.9'

আমি মকিতো-কোর এবং মকিতো-সমস্তর বিভিন্ন সংস্করণ চেষ্টা করেছি। তাদের কেউই কাজ করে না।


1
এটি যুক্ত করার জন্য, একটি জিনিস আমি লক্ষ্য করেছি যে আপনি যদি মকিতো সহ পাওয়ারমক ব্যবহার করছেন; তারপরে মেকমেকার প্লাগইন ফাইলটি 'src / test / উত্স / mockito-विस्तार / org.mockito.plugins.MockMaker' এ যুক্ত করা চূড়ান্ত ক্লাসগুলিকে উপহাস করার ক্ষেত্রে কার্যকর হবে না। পরিবর্তে, উপরে মাইকেল_জ্যাং দ্বারা উল্লিখিত একটি নির্ভরতা যুক্ত করা চূড়ান্ত শ্রেণির বিদ্রূপ করার বিষয়টি সমাধান করবে। এছাড়াও, নিশ্চিত করুন যে আপনি মকিতো 1 এর পরিবর্তে মকিতো 2 ব্যবহার করছেন
ডিসিওম

12

আমার ধারণা আপনি এটি তৈরি করেছেন finalকারণ আপনি অন্যান্য ক্লাসগুলি প্রসারিত হতে বাধা দিতে চান RainOnTrees। হিসাবে কার্যকর জাভা প্রস্তাব দেওয়া (আইটেম 15), এটা না করে এক্সটেনশানটির একটি বর্গ ঘনিষ্ঠ রাখার আরেকটি উপায় final:

  1. finalকীওয়ার্ডটি সরান ;

  2. এটির কনস্ট্রাক্টর তৈরি করুন private। কোনও শ্রেণি এটি বাড়িয়ে দিতে পারবে না কারণ এটি superকনস্ট্রাক্টরকে কল করতে সক্ষম হবে না ;

  3. আপনার ক্লাসটি ইনস্ট্যান্ট করার জন্য একটি স্থিতিশীল কারখানা পদ্ধতি তৈরি করুন।

    // No more final keyword here.
    public class RainOnTrees {
    
        public static RainOnTrees newInstance() {
            return new RainOnTrees();
        }
    
    
        private RainOnTrees() {
            // Private constructor.
        }
    
        public void startRain() {
    
            // some code here
        }
    }

এই কৌশলটি ব্যবহার করে, আপনি মকিতো ব্যবহার করতে পারবেন এবং অল্প বয়লারপ্লেট কোড সহ এক্সটেনশনের জন্য আপনার ক্লাসটি বন্ধ রাখতে পারবেন।


1
এটি চূড়ান্ত পদ্ধতির জন্য কাজ করে না যা মকিতো 2 দিয়েও উপহাস করা যায়।
asukasz Rzeszotarski

11

আমারও একই সমস্যা ছিল। যে ক্লাসটি নিয়ে আমি ঠাট্টা করার চেষ্টা করছিলাম এটি একটি সাধারণ শ্রেণি, তাই আমি কেবল এটির একটি উদাহরণ তৈরি করে তা ফিরিয়ে দিয়েছিলাম।


2
একেবারে, কেন একটি সাধারণ বর্গকে উপহাস করবেন? অন্যান্য সেবা, ইঞ্জিন, ডাটা শ্রেণীর ইত্যাদি বিদ্রূপকারী 'ব্যয়বহুল' পারস্পরিক ক্রিয়ার জন্য
StripLight

3
আপনি যদি এটির কোনও উদাহরণ তৈরি করেন তবে আপনি পরে এটিতে মকিতো.ভেরিভ পদ্ধতিগুলি প্রয়োগ করতে পারবেন না। মোকগুলির প্রধান ব্যবহার হ'ল এর কয়েকটি পদ্ধতির পরীক্ষা করতে সক্ষম হওয়া।
riroo

6

একবার চেষ্টা করে দেখুন:

Mockito.mock(SomeMockableType.class,AdditionalAnswers.delegatesTo(someInstanceThatIsNotMockableOrSpyable));

এটা আমার জন্য কাজ করেছে। "সামারমক্যাবলটাইপ কোড.ক্লাস" হ'ল আপনি যা উপহাস বা গুপ্তচর করতে চান তার পিতামাতার ক্লাস এবং কিছুInstanceThatIsNotMockableOrSpyable সেই আসল শ্রেণি যা আপনি উপহাস বা গুপ্তচর করতে চান।

আরও তথ্যের জন্য এখানে দেখুন


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

1
আপনি একটি উদাহরণ স্থাপন করতে পারেন?
বিশ্ব রত্না

5

আরেকটি ওয়ার্কারআউন্ড, যা কিছু ক্ষেত্রে প্রযোজ্য হতে পারে হ'ল final চূড়ান্ত শ্রেণীর দ্বারা প্রয়োগ করা একটি ইন্টারফেস তৈরি করা, কংক্রিট শ্রেণীর পরিবর্তে ইন্টারফেসটি ব্যবহার করার জন্য কোড পরিবর্তন করা এবং তারপরে ইন্টারফেসটিকে উপহাস করা। এটি আপনাকে চুক্তি (ইন্টারফেস) বাস্তবায়ন (চূড়ান্ত শ্রেণি) থেকে পৃথক করতে দেয়। অবশ্যই, আপনি যা চান তা যদি চূড়ান্ত শ্রেণিতে আবদ্ধ হয় তবে এটি প্রযোজ্য হবে না।


5

আসলে একটি উপায় আছে, যা আমি গুপ্তচরবৃত্তির জন্য ব্যবহার করি। কেবলমাত্র দুটি পূর্বশর্ত সন্তুষ্ট হলে এটি আপনার পক্ষে কাজ করবে:

  1. আপনি চূড়ান্ত শ্রেণির উদাহরণটি ইনজেক্ট করতে কোনও ধরণের ডিআই ব্যবহার করেন
  2. ফাইনাল ক্লাস একটি ইন্টারফেস প্রয়োগ করে

কার্যকর জাভা থেকে আইটেম 16 পুনরায় কল করুন । আপনি একটি মোড়ক তৈরি করতে পারেন (চূড়ান্ত নয়) এবং সমস্ত কলকে চূড়ান্ত শ্রেণির উদাহরণে ফরোয়ার্ড করতে পারেন:

public final class RainOnTrees implement IRainOnTrees {
    @Override public void startRain() { // some code here }
}

public class RainOnTreesWrapper implement IRainOnTrees {
    private IRainOnTrees delegate;
    public RainOnTreesWrapper(IRainOnTrees delegate) {this.delegate = delegate;}
    @Override public void startRain() { delegate.startRain(); }
}

এখন আপনি কেবল নিজের চূড়ান্ত শ্রেণিকেই বিদ্রূপ করতে পারবেন না, তবে এটির গুপ্তচরবৃত্তিও করতে পারেন:

public class Seasons{
    RainOnTrees rain;
    public Seasons(IRainOnTrees rain) { this.rain = rain; };
    public void findSeasonAndRain(){
        rain.startRain();
   }
}

IRainOnTrees rain = spy(new RainOnTreesWrapper(new RainOnTrees()) // or mock(IRainOnTrees.class)
doNothing().when(rain).startRain();
new Seasons(rain).findSeasonAndRain();

5

মকিতো 3 এবং আরওটিতে আমার একই সমস্যা আছে এবং এটি এই লিঙ্কটি থেকে ঠিক করেছি

মকিতো সহ মক ফাইনাল ক্লাস এবং পদ্ধতি অনুসরণ করুন

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

আমাদের org.mockito.plugins.MockMaker নামে প্রকল্পের src / test / উত্স / মকিতো-এক্সটেনশন ডিরেক্টরিতে একটি পাঠ্য ফাইল যুক্ত করতে হবে এবং পাঠ্যের একটি একক লাইন যুক্ত করতে হবে:

mock-maker-inline

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


4

অ্যান্ড্রয়েড + কোটলিনে একই সমস্যা (মকিতো + ফাইনাল ক্লাস) এর মুখোমুখি লোকদের জন্য সময় বাঁচা। যেমন কোটলিনে ক্লাসগুলি ডিফল্টরূপে চূড়ান্ত হয়। আমি আর্কিটেকচার উপাদান সহ গুগল অ্যান্ড্রয়েড একটি নমুনায় একটি সমাধান পেয়েছি। সমাধান এখান থেকে নেওয়া: https://github.com/googlesferences/android-architecture-components/blob/master/GithubBrowserSample

নিম্নলিখিত টীকাগুলি তৈরি করুন:

/**
 * This annotation allows us to open some classes for mocking purposes while they are final in
 * release builds.
 */
@Target(AnnotationTarget.ANNOTATION_CLASS)
annotation class OpenClass

/**
 * Annotate a class with [OpenForTesting] if you want it to be extendable in debug builds.
 */
@OpenClass
@Target(AnnotationTarget.CLASS)
annotation class OpenForTesting

আপনার গ্রেড ফাইল পরিবর্তন করুন। এখান থেকে উদাহরণ গ্রহণ করুন: https://github.com/googlesferences/android-architecture-components/blob/master/GithubBrowserSample/app/build.gradle

apply plugin: 'kotlin-allopen'

allOpen {
    // allows mocking for classes w/o directly opening them for release builds
    annotation 'com.android.example.github.testing.OpenClass'
}

এখন আপনি যে কোনও শ্রেণিকে পরীক্ষার জন্য উন্মুক্ত করতে এটিকে টীকা দিতে পারেন:

@OpenForTesting
class RepoRepository 

এটি অ্যাপ্লিকেশন স্তরের build.gradle এ ভাল কাজ করে তবে গ্রন্থাগার স্তরে এটি পেতে আমরা কী করতে পারি?
সুমিত টি

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

3

আপনি যদি মকিটো 2 ব্যবহার করেন তবে এটি করা যেতে পারে নতুন ইনকিউবেটিং বৈশিষ্ট্য যা চূড়ান্ত শ্রেণি এবং পদ্ধতিগুলির উপহাসকে সমর্থন করে।

লক্ষ্য করার মূল বিষয়গুলি:
1. "org.mockito.plugins.MockMaker" নামের একটি সাধারণ ফাইল তৈরি করুন এবং এটি "মকিতো-এক্সটেনশনস" নামে একটি ফোল্ডারে রাখুন। এই ফোল্ডারটি ক্লাসপথে উপলব্ধ করা উচিত।
২. উপরে বর্ণিত ফাইলটির বিষয়বস্তু নীচের মত একটি একক লাইন হওয়া উচিত:
মক-মেকার-ইনলাইন

মকিতো এক্সটেনশন প্রক্রিয়াটি সক্রিয় করতে এবং এই অপ্ট-ইন বৈশিষ্ট্যটি ব্যবহার করতে উপরের দুটি পদক্ষেপের প্রয়োজন।

নমুনা শ্রেণি নিম্নরূপ:

FinalClass.java

public final class FinalClass {

public final String hello(){
    System.out.println("Final class says Hello!!!");
    return "0";
}

}

Foo.java

public class Foo {

public String executeFinal(FinalClass finalClass){
    return finalClass.hello();
}

}

FooTest.java

public class FooTest {

@Test
public void testFinalClass(){
    // Instantiate the class under test.
    Foo foo = new Foo();

    // Instantiate the external dependency
    FinalClass realFinalClass = new FinalClass();

    // Create mock object for the final class. 
    FinalClass mockedFinalClass = mock(FinalClass.class);

    // Provide stub for mocked object.
    when(mockedFinalClass.hello()).thenReturn("1");

    // assert
    assertEquals("0", foo.executeFinal(realFinalClass));
    assertEquals("1", foo.executeFinal(mockedFinalClass));

}

}

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

এখানে সম্পূর্ণ নিবন্ধটি উপহাস-দ্য আনমকযোগ্য


আপনার উত্তরটি এখানে অন্তর্ভুক্ত করা উচিত এবং কোনও বাহ্যিক সাইটের সাথে লিঙ্ক না করা উচিত। যদি পদ্ধতিটি দীর্ঘ হয় তবে আপনি একটি ওভারভিউ অন্তর্ভুক্ত করতে পারেন।
rghome

@ রনউইথ (পাওয়ারমকআরনারক্লাস) @ প্রিপার্পেয়ারটেষ্ট ({আফিনালক্লাস.ক্লাস}) উপহাস করার সময় নীচে টীকাগুলি ব্যবহার করা হয়েছে তা নিশ্চিত করুন
ভিসিলিউশন

1
@vCillusion - আমি যে উদাহরণটি দেখিয়েছি তা কেবল মকিতো 2 এপিআই ব্যবহার করে M
কেএসএল

2

হ্যাঁ এখানে একই সমস্যা, আমরা মকিতো দিয়ে একটি চূড়ান্ত শ্রেণিকে উপহাস করতে পারি না। নির্ভুল হতে, মকিতো নিম্নলিখিতগুলি উপহাস / গুপ্তচর করতে পারে না:

  • চূড়ান্ত ক্লাস
  • বেনাম ক্লাস
  • আদিম ধরণের

তবে একটি র‍্যাপার ক্লাস ব্যবহার করে আমার কাছে অর্থ প্রদানের বড় মূল্য মনে হয়েছে, সুতরাং পরিবর্তে পাওয়ারমকিতো পান।


2

আমি মনে করি আপনার নীতিগতভাবে আরও চিন্তা করা প্রয়োজন। পরিবর্তে আপনি চূড়ান্ত শ্রেণীর পরিবর্তে তার ইন্টারফেস এবং মক ইন্টারফেসটি ব্যবহার করুন।

এর জন্য:

 public class RainOnTrees{

   fun startRain():Observable<Boolean>{

        // some code here
   }
}

যোগ

interface iRainOnTrees{
  public void startRain():Observable<Boolean>
}

এবং আপনার ইন্টারফেস উপহাস:

 @Before
    fun setUp() {
        rainService= Mockito.mock(iRainOnTrees::class.java)

        `when`(rainService.startRain()).thenReturn(
            just(true).delay(3, TimeUnit.SECONDS)
        )

    }

1

দয়া করে জেএমকিতকে দেখুন । এর অনেক উদাহরণ সহ বিস্তৃত ডকুমেন্টেশন রয়েছে। এখানে আপনার সমস্যার একটি উদাহরণ রয়েছে (সরল করার জন্য আমি Seasonsউপহাসের সাথে ইনজেক্ট করতে কনস্ট্রাক্টর যুক্ত করেছি RainOnTrees):

package jmockitexample;

import mockit.Mocked;
import mockit.Verifications;
import mockit.integration.junit4.JMockit;
import org.junit.Test;
import org.junit.runner.RunWith;

@RunWith(JMockit.class)
public class SeasonsTest {

    @Test
    public void shouldStartRain(@Mocked final RainOnTrees rain) {
        Seasons seasons = new Seasons(rain);

        seasons.findSeasonAndRain();

        new Verifications() {{
            rain.startRain();
        }};
    }

    public final class RainOnTrees {
        public void startRain() {
            // some code here
        }

    }

    public class Seasons {

        private final RainOnTrees rain;

        public Seasons(RainOnTrees rain) {
            this.rain = rain;
        }

        public void findSeasonAndRain() {
            rain.startRain();
        }

    }
}

1

আরসি এবং লুইজি আর ভিগিজিয়ানোর একত্রে প্রদত্ত সমাধানগুলি সম্ভবত সেরা ধারণা।

যদিও Mockito না পারেন , নকশা দ্বারা চূড়ান্ত শ্রেণীর বিদ্রুপ করে প্রতিনিধিদল পদ্ধতির সম্ভব । এর এর সুবিধা রয়েছে:

  1. আপনার এপিআই প্রথম স্থানে যা চায় তা যদি আপনি চূড়ান্তভাবে অ-ফাইনালে পরিণত করতে বাধ্য হন না (চূড়ান্ত শ্রেণির তাদের সুবিধা রয়েছে ) এর উদ্দেশ্যটি ।
  2. আপনি আপনার এপিআই এর চারপাশে একটি সজ্জার সম্ভাবনা পরীক্ষা করছেন ।

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

অতএব আপনি পরীক্ষাটিও দেখিয়ে দিতে পারেন যে ব্যবহারকারী কেবলমাত্র এপিআই প্রসারিত করার পরিবর্তে সজ্জিত করতে পারে।

আরও সাবজেক্টিভ নোটে: আমি ফ্রেমওয়ার্কগুলি সর্বনিম্ন রাখা পছন্দ করি, এজন্য জুনিত এবং মকিতো সাধারণত আমার পক্ষে যথেষ্ট। প্রকৃতপক্ষে, এইভাবে সীমাবদ্ধ করা আমাকে মাঝে মাঝে ভাল করার জন্যও রিফ্যাক্টর করতে বাধ্য করে।


1

আপনি অধীনে ইউনিট পরীক্ষার চালানোর চেষ্টা যদি পরীক্ষা ফোল্ডারের তবে শীর্ষ সমাধানটি ঠিক আছে। এটি কেবল এক্সটেনশন যুক্ত করে অনুসরণ করুন।

তবে আপনি যদি এন্ড্রয়েড সম্পর্কিত ক্লাস যেমন প্রসঙ্গ বা ক্রিয়াকলাপের সাথে অ্যান্ড্রয়েডেস্ট ফোল্ডারের অধীনে চালাতে চান তবে উত্তরটি আপনার জন্য।


1

সফলভাবে রান মকিতোর জন্য এই নির্ভরতা যুক্ত করুন:

testImplementation 'org.mockito: mockito কোর: 2.24.5'
testImplementation "org.mockito: mockito-ইনলাইন: 2.24.5"


0

অন্যরা যেমন বলেছে, এটি মকিতো সহ বাক্সটির বাইরে কাজ করবে না। আমি পরীক্ষার অধীনে কোডটির দ্বারা ব্যবহৃত অবজেক্টের নির্দিষ্ট ক্ষেত্রগুলি সেট করতে প্রতিবিম্বটি ব্যবহার করার পরামর্শ দেব। আপনি যদি নিজেকে এটি অনেক কিছু করতে দেখেন তবে আপনি এই কার্যকারিতাটি একটি লাইব্রেরিতে গুটিয়ে রাখতে পারেন।

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


1
পাবলিক এপিআই ক্লাসগুলি এক্সটেনশনের জন্য উন্মুক্ত থাকতে হবে। পুরোপুরি একমত। তবে, একটি ব্যক্তিগত কোড-বেসে, finalডিফল্ট হওয়া উচিত।
এরিক

0

আমাদের জন্য, এটি ছিল কারণ আমরা মকিটো-ইনলাইনটি কইন-টেস্ট থেকে বাদ দিয়েছি। একটি গ্রেড মডিউলটি আসলে এটির প্রয়োজন ছিল এবং কারণ হিসাবে কেবল মুক্তি বিল্ডগুলিতে ব্যর্থ হয়েছিল (আইডিইতে ডিবাগ বিল্ডগুলি কাজ করেছিল): পি


0

চূড়ান্ত শ্রেণির জন্য উপহাসের জন্য নীচে যুক্ত করুন এবং স্থির বা অ স্থিত কল করুন।

1- ক্লাস স্তরে এটি যোগ করুন @ সাপ্রেস স্ট্যাটিকআইনিটাইজেশন জন্য (মান = package প্যাকেজ সহ শ্রেণীর নাম})
2- পাওয়ারমকিতো.মকস্ট্যাটিক ( শ্রেণীর নাম.class) ক্লাসকে মক করবে
3 টি তারপরে এই শ্রেণীর কল করার পদ্ধতিটি কল করার সময় মক অবজেক্টটি ফেরত দেওয়ার জন্য আপনার বিবৃতিটি ব্যবহার করুন।

উপভোগ করুন


-5

চূড়ান্ত চেষ্টা করেন নি, তবে ব্যক্তিগত জন্য, প্রতিবিম্ব ব্যবহার করে মোডিফায়ারকে কাজটি সরান! আরও পরীক্ষা করে দেখেছি, এটি ফাইনালের পক্ষে কাজ করে না।


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