প্রতিচ্ছবি দ্বারা বেসিক ক্ষেত্রগুলি পেতে / সেট করা অপব্যবহার করবেন না
এখানে বেশ কয়েকটি উত্তরে যেমন প্রতিবিম্ব ব্যবহার করা হয় তবে এমন কিছু যা আমরা এড়াতে পারি।
এটি একাধিক ত্রুটিগুলি উপস্থাপন করার সময় এটি একটি ছোট মান নিয়ে আসে:
- আমরা কেবল রানটাইমে প্রতিবিম্বের সমস্যাগুলি সনাক্ত করি (উদা: ক্ষেত্রগুলি আর বিদ্যমান নয়)
- আমরা এনকেপসুলেশন চাই তবে একটি অস্বচ্ছ শ্রেণি নয় যা নির্ভরযোগ্যতাগুলি লুকিয়ে রাখে যা দৃশ্যমান হওয়া উচিত এবং শ্রেণিকে আরও অস্বচ্ছ এবং কম পরীক্ষামূলক করে তোলে।
- এটি খারাপ নকশা উত্সাহ দেয়। আজ আপনি একটি ঘোষণা
@Value String field
। কাল আপনি এই ক্লাসে তাদের 5
বা 10
তাদের ঘোষণা করতে পারেন এবং আপনি ক্লাসের নকশাটি হ্রাস করেছেন তা সম্পর্কে সরাসরি অবগত হতেও পারেন না। এই ক্ষেত্রগুলিকে সেট করার জন্য আরও দৃশ্যমান পদ্ধতির (যেমন কনস্ট্রাক্টর), আপনি এই সমস্ত ক্ষেত্রগুলি যুক্ত করার আগে একবার দু'বার ভাবেন এবং আপনি সম্ভবত এগুলিকে অন্য শ্রেণিতে আবদ্ধ করে ব্যবহার করবেন @ConfigurationProperties
।
আপনার শ্রেণিকে পরীক্ষামূলকভাবে উভয়ই একক এবং একীকরণে পরিণত করুন
আপনার স্প্রিং উপাদান শ্রেণীর জন্য প্লেইন ইউনিট পরীক্ষা (এটি একটি চলমান স্প্রিং ধারক ছাড়াই) এবং ইন্টিগ্রেশন টেস্ট উভয়ই লিখতে সক্ষম হতে আপনাকে এই ক্লাসটি স্প্রিংয়ের সাথে বা ছাড়াই ব্যবহারযোগ্য করতে হবে।
যখন প্রয়োজন হয় না তখন ইউনিট পরীক্ষায় একটি ধারক চালানো একটি খারাপ অভ্যাস যা স্থানীয় বিল্ডগুলি ধীর করে দেয়: আপনি এটি চান না।
আমি এই উত্তরটি যুক্ত করেছি কারণ এখানে কোনও উত্তরই এই পার্থক্যটি দেখায় না এবং তাই তারা নিয়মিতভাবে চলমান ধারকটির উপর নির্ভর করে।
সুতরাং আমি মনে করি যে আপনি এই সম্পত্তি শ্রেণীর অভ্যন্তরীণ হিসাবে সংজ্ঞায়িত করা উচিত:
@Component
public class Foo{
@Value("${property.value}") private String property;
//...
}
একটি কনস্ট্রাক্টর প্যারামিটারে যা স্প্রিং দ্বারা ইনজেকশনের হবে:
@Component
public class Foo{
private String property;
public Foo(@Value("${property.value}") String property){
this.property = property;
}
//...
}
ইউনিট পরীক্ষার উদাহরণ
আপনি Foo
বসন্ত ছাড়াই ইনস্ট্যান্টিয়েট করতে পারেন এবং নির্মাতাকে property
ধন্যবাদ দেওয়ার জন্য কোনও মান ইনজেক্ট করতে পারেন :
public class FooTest{
Foo foo = new Foo("dummyValue");
@Test
public void doThat(){
...
}
}
একীকরণ পরীক্ষার উদাহরণ
আপনি এই সহজ উপায় ধন্যবাদ স্প্রিং বুট সঙ্গে প্রেক্ষাপটে সম্পত্তি ইনজেকশনের পারেন properties
এর অ্যাট্রিবিউট @SpringBootTest
:
@SpringBootTest(properties="property.value=dummyValue")
public class FooTest{
@Autowired
Foo foo;
@Test
public void doThat(){
...
}
}
আপনি বিকল্প হিসাবে ব্যবহার করতে পারেন @TestPropertySource
তবে এটি একটি অতিরিক্ত টিকা যুক্ত করে:
@SpringBootTest
@TestPropertySource("property.value=dummyValue")
public class FooTest{ ...}
স্প্রিংয়ের সাথে (স্প্রিং বুট ব্যতীত) কিছুটা জটিল হওয়া উচিত তবে দীর্ঘকাল থেকে আমি স্প্রিং বুট ছাড়াই স্প্রিং ব্যবহার করি না বলে আমি বোকা কিছু বলতে পছন্দ করি না।
পার্শ্ব নোট হিসাবে: আপনার কাছে যদি অনেকগুলি @Value
ক্ষেত্র সেট করার থাকে তবে এগুলি দিয়ে বর্ণিত শ্রেণিতে সেগুলি উত্তোলন @ConfigurationProperties
আরও প্রাসঙ্গিক কারণ আমরা খুব বেশি যুক্তিযুক্ত কোনও নির্মাণকারী চাই না।