পাওয়ারমকিতো.ওহেন নিউ () ব্যবহার করে বিদ্রূপ হচ্ছে না এবং আসল পদ্ধতিটি বলা হয়


104

আমার নীচে এর মতো কিছুটা কোড রয়েছে:

Class A {
  public boolean myMethod(someargs) {
    MyQueryClass query = new MyQueryClass();
    Long id = query.getNextId();
    // some more code
  }
}
Class MyQueryClass     {
  ....
  public Long getNextId() {
    //lot of DB code, execute some DB query
    return id;
  }
}

এখন আমি একটি পরীক্ষা লিখছি A.myMethod(someargs)। আমি আসল পদ্ধতিটি এড়িয়ে চলতে চাই query.getNextId()এবং পরিবর্তে একটি স্টাবের মান দেব । মূলত, আমি ঠাট্টা করতে চান MyQueryClass

সুতরাং আমার পরীক্ষার ক্ষেত্রে, আমি ব্যবহার করেছি:

MyQueryClass query = PowerMockito.mock(MyQueryClass.class);
PowerMockito.whenNew(MyQueryClass.class).withNoArguments().thenReturn(query);
when(query.getNextId()).thenReturn(1000000L);

boolean b = A.getInstance().myMethod(args);

//asserts

আমি ব্যবহার করেছি @RunWith(PowerMockRunner.class)এবং @PrepareForTest({MyQueryClass.class})আমার পরীক্ষার ক্লাসের শুরুতে।

কিন্তু যখন আমি পরীক্ষাটি ডিবাগ করি তখন getNextId()এটি MyQueryClassক্লাসের আসল পদ্ধতিটিকে কল করে ।

আমি এখানে কি মিস করছি? আমি মকিতো এবং পাওয়ারমকিতোতে নতুন হিসাবে যে কেউ সহায়তা করতে পারে।

উত্তর:


230

আপনার যে ক্লাসটি নির্মাণ করা হচ্ছে@PrepareForTest সেই ক্লাসের পরিবর্তে টিকাকরণে যেখানে কনস্ট্রাক্টরকে ডেকে আনা হবে - নতুন অবজেক্টের মক নির্মাণ দেখুন ।

আপনার ক্ষেত্রে:

@PrepareForTest(MyQueryClass.class)

@PrepareForTest(A.class)

আরও সাধারণ:

@PrepareForTest(NewInstanceClass.class)

@PrepareForTest(ClassThatCreatesTheNewInstance.class)


4
অনেক ধন্যবাদ. @ParepareforTest এ বর্তমান ক্লাস Eg A অন্তর্ভুক্ত করার পরে এটি এখন কাজ করেছে।
ব্যবহারকারী 3942446

4
আমিও এর জন্য কিছুটা সময় কাটিয়েছি। ধন্যবাদ @ ট্রুডাব কারণ রেফারেন্সটি পুরানো। আমি শুধু এটি আপডেট। github.com/jayway/powermock/wiki/MockConstructor এটি বলেছে: পরীক্ষার মামলার শ্রেণি পর্যায়ে @Prepare ForTest (ClassThatCreatesTheNewInstance.class) টিকা ব্যবহার করুন।
ভিক্টর চয়ে

4
আমার একই সমস্যা রয়েছে তবে এই সমাধানটি আমার পক্ষে কাজ করছে না
ডেক্সটার

4
আপনি কোড কভারেজের জন্য ইলেকমা ব্যবহার করছেন তবে এই সমাধানটি কার্যকর হবে না। @ প্রিপারেফোরস্টেস্টের অধীনে পরীক্ষার অধীনে ক্লাস যুক্ত করার ফলে সেই শ্রেণীর জন্য 0% কভারেজ আসবে
এসিভি

4
সমাধানটি কাজ করবে - পরীক্ষাটি সঠিকভাবে সম্পাদন করে। স্পষ্টতই ইলেকমা পাওয়ারমার্কিটো মোকাবেলায় সজ্জিত নয়। কোড কভারেজ এই প্রশ্নের অংশ নয়।
ট্রুডাব

5

@ ট্র্রুডাব তার গৃহীত উত্তরে যেমন উল্লেখ করেছেন, আপনাকে যেখানে ক্লাসটি কনস্ট্রাক্টর ডেকে আনা হয়েছে সেখানে ক্লাস যুক্ত করতে হবে @PrepareForTest

তবে, আপনি যদি এটি করেন তবে ক্লাসের ক্লায়ামের জন্য ক্লেমেমা এবং সোনার রিপোর্ট অনুসারে শূন্য হবে class

পাওয়ারমোকিটো উইকি

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

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


আপনার মন্তব্যের সাথে একমত
লাথি

যদিও এটি ইন্টেলিজের কোনও সমস্যা নয়।
এসিভি

আমি বিশ্বাস করি এটি কেবল পরীক্ষার শ্রেণিকেই প্রভাবিত করে যেখানে আপনি এই টীকাটি ব্যবহার করেছেন, যাতে আপনি প্রভাবগুলি হ্রাস করতে এই পরীক্ষাগুলি আলাদা করতে পারেন। আমি পুরোপুরি একমত যে সমস্যাটি সত্যই এই যে ক্লাসটি পরীক্ষার জন্য যথাযথভাবে তৈরি করা হয়নি
Calabacin

0

সম্ভবত আপনি সহজভাবে ব্যবহার করতে পারেন

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