আমি আপনাকে কিছুটা আপনার কোডটি রিফ্যাক্ট করার পরামর্শ দেব। আপনার কোডটি পরীক্ষা করার জন্য আপনাকে যখন প্রতিবিম্ব বা অন্যান্য ধরণের স্টাফ ব্যবহার করার কথা ভাবতে শুরু করে তখন আপনার কোডের সাথে কিছু ভুল হচ্ছে।
আপনি বিভিন্ন ধরণের সমস্যার কথা উল্লেখ করেছেন। আসুন ব্যক্তিগত ক্ষেত্র দিয়ে শুরু করা যাক। বেসরকারী ক্ষেত্রগুলির ক্ষেত্রে আমি একটি নতুন কন্সট্রাক্টর যুক্ত করে তাতে ক্ষেত্রগুলি ইনজেকশন করতে পারতাম। এর পরিবর্তে:
public class ClassToTest {
private final String first = "first";
private final List<String> second = new ArrayList<>();
...
}
আমি এটি ব্যবহার করতাম:
public class ClassToTest {
private final String first;
private final List<String> second;
public ClassToTest() {
this("first", new ArrayList<>());
}
public ClassToTest(final String first, final List<String> second) {
this.first = first;
this.second = second;
}
...
}
এমনকি কিছু উত্তরাধিকারের কোড সহ এটি কোনও সমস্যা হবে না। ওল্ড কোডটি একটি খালি কনস্ট্রাক্টর ব্যবহার করবে এবং আপনি যদি আমাকে জিজ্ঞাসা করেন তবে রিফ্যাক্টর কোডটি আরও পরিষ্কার দেখাচ্ছে এবং আপনি প্রতিফলন ছাড়াই পরীক্ষায় প্রয়োজনীয় মানগুলি ইনজেক্ট করতে সক্ষম হবেন।
এখন বেসরকারী পদ্ধতি সম্পর্কে। আমার ব্যক্তিগত অভিজ্ঞতায় যখন আপনাকে পরীক্ষার জন্য কোনও ব্যক্তিগত পদ্ধতিতে স্টাড করতে হয়, তখন সেই পদ্ধতিটির সেই শ্রেণিতে কিছুই করার থাকে না। একটি সাধারণ প্যাটার্ন, সেক্ষেত্রে এটি একটি ইন্টারফেসের মধ্যে আবৃত করা হবে, Callable
এবং তারপরে আপনি সেই ইন্টারফেসটি কনস্ট্রাক্টরেও পাস করবেন (সেই একাধিক কনস্ট্রাক্টর ট্রিক সহ):
public ClassToTest() {
this(...);
}
public ClassToTest(final Callable<T> privateMethodLogic) {
this.privateMethodLogic = privateMethodLogic;
}
বেশিরভাগ ক্ষেত্রে আমি যা লিখেছি তা দেখে মনে হচ্ছে এটি নির্ভরতা ইনজেকশন প্যাটার্ন। আমার ব্যক্তিগত অভিজ্ঞতায় এটি পরীক্ষার সময় সত্যই কার্যকর এবং আমি মনে করি যে এই জাতীয় কোডটি পরিষ্কার এবং এটি বজায় রাখা আরও সহজ হবে। নেস্টেড ক্লাস সম্পর্কে আমিও একই কথা বলব। যদি কোনও নেস্টেড ক্লাসে ভারী যুক্তি থাকে তবে আপনি এটিকে প্যাকেজ বেসরকারী শ্রেণি হিসাবে স্থানান্তরিত করে এটির প্রয়োজনীয় ক্লাসে ectedুকিয়ে দিলে ভাল হয়।
লিগ্যাসি কোডটি রিফ্যাক্টরিং এবং বজায় রাখার সময় আমি ব্যবহার করেছি এমন আরও বেশ কয়েকটি ডিজাইনের ধরণ রয়েছে তবে এটি সব আপনার কোডের পরীক্ষার ক্ষেত্রে নির্ভর করে। প্রতিবিম্বটি ব্যবহার করা বেশিরভাগই সমস্যা নয়, তবে আপনার যখন কোনও উদ্যোগের অ্যাপ্লিকেশন থাকে যা প্রচুর পরীক্ষা করা হয় এবং প্রতিটি স্থাপনার আগে পরীক্ষাগুলি চালানো হয় তখন সমস্ত কিছু সত্যই ধীর হয়ে যায় (এটি কেবল বিরক্তিকর এবং আমি এ জাতীয় জিনিস পছন্দ করি না)।
সেটার ইনজেকশনও রয়েছে, তবে আমি এটি ব্যবহার করার পরামর্শ দেব না। আমি আরও ভাল কোনও কনস্ট্রাক্টরের সাথে লেগে থাকতাম এবং প্রয়োজনীয়তা নির্ভরতা ইনজেকশনের সম্ভাবনা রেখে, যখন এটি সত্যই প্রয়োজন হয় তখন সমস্ত কিছু শুরু করতাম।