পাওয়ারমোকিটো মক সিঙ্গল স্ট্যাটিক পদ্ধতি এবং রিটার্ন অবজেক্ট


101

আমি একটি ক্লাস থেকে একটি স্ট্যাটিক পদ্ধতি এম 1 উপহাস করতে চাই যাতে 2 টি স্ট্যাটিক পদ্ধতি, এম 1 এবং এম 2 থাকে। এবং আমি চাই যে পদ্ধতিটি এম 1 কোনও বস্তু ফেরত পাঠাবে।

আমি নিম্নলিখিত চেষ্টা করেছিলাম

1)

PowerMockito.mockStatic(Static.class, new Answer<Long>() {
         @Override
         public Long answer(InvocationOnMock invocation) throws Throwable {
            return 1000l;
         }
      });

এটি এম 1 এবং এম 2 উভয়কেই কল করছে, যার আলাদা রিটার্ন টাইপ রয়েছে, সুতরাং এটি একটি রিটার্ন টাইপ মিলহীন ত্রুটি দেয়।

2) PowerMockito.when(Static.m1(param1, param2)).thenReturn(1000l); তবে এম 1 কার্যকর হলে এটি বলা হয় না।

3) PowerMockito.mockPartial(Static.class, "m1"); সংকলক ত্রুটি দেয় যে মক পার্টিশিয়াল উপলব্ধ নয়, যা আমি http://code.google.com/p/powermock/wiki/MockitoUsage থেকে পেয়েছি ।

উত্তর:


138

আপনি যা করতে চান তা 1 এবং 2 এর সমস্ত অংশের সংমিশ্রণ।

শ্রেণীর সমস্ত স্থিতিশীল পদ্ধতির জন্য স্থির বিদ্রূপ সক্ষম করতে আপনাকে পাওয়ারমকিটো.মকস্ট্যাটিক ব্যবহার করতে হবে। এর অর্থ যখন ততক্ষণে রিটার্ন সিনট্যাক্স ব্যবহার করে এগুলিকে আটকানো সম্ভব করে তোলে।

আপনি মকস্ট্যাটিকের 2-যুক্তিযুক্ত ওভারলোডটি মকিতো / পাওয়ারমককে কী করা উচিত তার জন্য একটি ডিফল্ট কৌশল সরবরাহ করে যখন আপনি কোনও পদ্ধতি কল করেন যখন আপনি মক উদাহরণটিতে স্পষ্টভাবে স্ট্যাবড করেন নি।

জাভাডোক থেকে :

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

ডিফল্ট ডিফল্ট stubbing কৌশল অবশ্য বিনিময়ে নাল, 0 বা বস্তু, সংখ্যা জন্য মিথ্যা হয় এবং মূল্যবান পদ্ধতি বুলিয়ান। ২-আরগের ওভারলোডটি ব্যবহার করে আপনি বলছেন "না, না, না, ডিফল্টভাবে এই উত্তর সাবক্লাসের উত্তর পদ্ধতিটি ডিফল্ট মান পেতে ব্যবহার করুন a এটি একটি দীর্ঘ প্রত্যাবর্তন করে, যদি আপনার কাছে স্থিতিশীল পদ্ধতি থাকে যা কিছু অসম্পূর্ণভাবে ফিরে আসে if দীর্ঘ, একটি সমস্যা আছে।

পরিবর্তে, স্ট্যাটিক পদ্ধতিগুলির স্টাবিং সক্ষম করতে মকস্ট্যাটিকের 1-আরগ সংস্করণটি ব্যবহার করুন, তারপরে কোনও নির্দিষ্ট পদ্ধতির জন্য কী করবেন তা নির্দিষ্ট করার জন্য যখন-ততপর পুনরায় ব্যবহার করুন। উদাহরণ স্বরূপ:

import static org.mockito.Mockito.*;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

class ClassWithStatics {
  public static String getString() {
    return "String";
  }

  public static int getInt() {
    return 1;
  }
}

@RunWith(PowerMockRunner.class)
@PrepareForTest(ClassWithStatics.class)
public class StubJustOneStatic {
  @Test
  public void test() {
    PowerMockito.mockStatic(ClassWithStatics.class);

    when(ClassWithStatics.getString()).thenReturn("Hello!");

    System.out.println("String: " + ClassWithStatics.getString());
    System.out.println("Int: " + ClassWithStatics.getInt());
  }
}

স্ট্রিং-ভ্যালু স্ট্যাটিক পদ্ধতিটি "হ্যালো!" ফেরত দিতে স্ট্যাবড হয়, যখন ইনট-ভ্যালু স্ট্যাটিক পদ্ধতি ডিফল্ট স্ট্যাবিং ব্যবহার করে 0 ফিরে আসে।


4
রিপ্লে দরকার নেই?
বালাজী বোগগ্রাম রমনারায়ণ

হুম ... বাছা মনে হচ্ছে। হয়তো পাওয়ারমোকিটো আপনার জন্য পাওয়ারমক রিপ্লে করে? আমি এটা সম্পর্কে অবাক।
jangofan

4
তবে যদি আমার নিশ্চিত হওয়া দরকার যে কিছু স্থির পদ্ধতি সুনির্দিষ্ট যুক্তি দিয়ে ডেকেছে?
#Tomato

6
@PrepareForTestটীকা বর্গ যে হওয়া উচিত আহ্বান স্ট্যাটিক পদ্ধতি, না বর্গ যেখানে স্ট্যাটিক পদ্ধতি।
হ্যাজেল ট্রস্ট

6
@ হ্যাজেলট্রোস্ট - না, ওপি ঠিক আছে। এটি স্ট্যাটিক পদ্ধতিযুক্ত শ্রেণি যা পরীক্ষার জন্য প্রস্তুত করা উচিত। সুতরাং, @PrepareForTest(ClassWithStatics.class)সঠিক।
36 এরি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.