Hilt-এর মতো ডিপেন্ডেন্সি ইনজেকশন ফ্রেমওয়ার্ক ব্যবহারের একটি সুবিধা হলো, এটি আপনার কোড পরীক্ষা করা সহজ করে তোলে।
ইউনিট পরীক্ষা
ইউনিট টেস্টের জন্য Hilt অপরিহার্য নয়, কারণ কনস্ট্রাক্টর ইনজেকশন ব্যবহার করে এমন কোনো ক্লাস টেস্ট করার সময়, সেই ক্লাসটি ইনস্ট্যানশিয়েট করতে Hilt ব্যবহার করার প্রয়োজন হয় না। এর পরিবর্তে, আপনি ফেক বা মক ডিপেন্ডেন্সি পাস করে সরাসরি একটি ক্লাস কনস্ট্রাক্টরকে কল করতে পারেন, ঠিক যেমনটা আপনি করতেন যদি কনস্ট্রাক্টরটি অ্যানোটেটেড না থাকতো:
কোটলিন
@ActivityScoped class AnalyticsAdapter @Inject constructor( private val service: AnalyticsService ) { ... } class AnalyticsAdapterTest { @Test fun `Happy path`() { // You don't need Hilt to create an instance of AnalyticsAdapter. // You can pass a fake or mock AnalyticsService. val adapter = AnalyticsAdapter(fakeAnalyticsService) assertEquals(...) } }
জাভা
@ActivityScope public class AnalyticsAdapter { private final AnalyticsService analyticsService; @Inject AnalyticsAdapter(AnalyticsService analyticsService) { this.analyticsService = analyticsService; } } public final class AnalyticsAdapterTest { @Test public void happyPath() { // You don't need Hilt to create an instance of AnalyticsAdapter. // You can pass a fake or mock AnalyticsService. AnalyticsAdapter adapter = new AnalyticsAdapter(fakeAnalyticsService); assertEquals(...); } }
এন্ড-টু-এন্ড পরীক্ষা
ইন্টিগ্রেশন টেস্টের জন্য, হিল্ট আপনার প্রোডাকশন কোডের মতোই ডিপেন্ডেন্সিগুলো যুক্ত করে। হিল্ট দিয়ে টেস্টিং করার জন্য কোনো রক্ষণাবেক্ষণের প্রয়োজন হয় না, কারণ এটি প্রতিটি টেস্টের জন্য স্বয়ংক্রিয়ভাবে এক নতুন সেট কম্পোনেন্ট তৈরি করে।
টেস্টিং নির্ভরতা যোগ করা
আপনার টেস্টে Hilt ব্যবহার করতে, আপনার প্রজেক্টে hilt-android-testing ডিপেন্ডেন্সিটি অন্তর্ভুক্ত করুন:
গ্রুভি
dependencies { // For Robolectric tests. testImplementation 'com.google.dagger:hilt-android-testing:2.57.1' // ...with Kotlin. kaptTest 'com.google.dagger:hilt-android-compiler:2.57.1' // ...with Java. testAnnotationProcessor 'com.google.dagger:hilt-android-compiler:2.57.1' // For instrumented tests. androidTestImplementation 'com.google.dagger:hilt-android-testing:2.57.1' // ...with Kotlin. kaptAndroidTest 'com.google.dagger:hilt-android-compiler:2.57.1' // ...with Java. androidTestAnnotationProcessor 'com.google.dagger:hilt-android-compiler:2.57.1' }
কোটলিন
dependencies { // For Robolectric tests. testImplementation("com.google.dagger:hilt-android-testing:2.57.1") // ...with Kotlin. kaptTest("com.google.dagger:hilt-android-compiler:2.57.1") // ...with Java. testAnnotationProcessor("com.google.dagger:hilt-android-compiler:2.57.1") // For instrumented tests. androidTestImplementation("com.google.dagger:hilt-android-testing:2.57.1") // ...with Kotlin. kaptAndroidTest("com.google.dagger:hilt-android-compiler:2.57.1") // ...with Java. androidTestAnnotationProcessor("com.google.dagger:hilt-android-compiler:2.57.1") }
UI টেস্ট সেটআপ
যেসব UI টেস্টে Hilt ব্যবহার করা হয়, সেগুলোতে আপনাকে অবশ্যই @HiltAndroidTest অ্যানোটেশনটি যুক্ত করতে হবে। এই অ্যানোটেশনটি প্রতিটি টেস্টের জন্য Hilt কম্পোনেন্টগুলো তৈরি করার দায়িত্বে থাকে।
এছাড়াও, আপনাকে টেস্ট ক্লাসে HiltAndroidRule যোগ করতে হবে। এটি কম্পোনেন্টগুলোর স্টেট পরিচালনা করে এবং আপনার টেস্টে ইনজেকশন সম্পাদন করতে ব্যবহৃত হয়:
কোটলিন
@HiltAndroidTest class SettingsActivityTest { @get:Rule var hiltRule = HiltAndroidRule(this) // UI tests here. }
জাভা
@HiltAndroidTest public final class SettingsActivityTest { @Rule public HiltAndroidRule hiltRule = new HiltAndroidRule(this); // UI tests here. }
এরপরে, আপনার টেস্টকে Application ক্লাসটি সম্পর্কে জানতে হবে, যা Hilt আপনার জন্য স্বয়ংক্রিয়ভাবে তৈরি করে।
পরীক্ষার অ্যাপ্লিকেশন
আপনাকে অবশ্যই Hilt সমর্থন করে এমন একটি Application অবজেক্টে Hilt ব্যবহার করে এমন ইন্সট্রুমেন্টেড টেস্টগুলো চালাতে হবে। লাইব্রেরিটি টেস্টে ব্যবহারের জন্য HiltTestApplication প্রদান করে। যদি আপনার টেস্টের জন্য একটি ভিন্ন বেস অ্যাপ্লিকেশনের প্রয়োজন হয়, তবে টেস্টের জন্য কাস্টম অ্যাপ্লিকেশন দেখুন।
আপনার ইন্সট্রুমেন্টেড টেস্ট অথবা রোবোইলেকট্রিক টেস্টে চালানোর জন্য আপনাকে অবশ্যই আপনার টেস্ট অ্যাপ্লিকেশনটি সেট করতে হবে। নিম্নলিখিত নির্দেশাবলী হিল্ট-এর জন্য নির্দিষ্ট নয়, বরং টেস্টে চালানোর জন্য একটি কাস্টম অ্যাপ্লিকেশন কীভাবে নির্দিষ্ট করতে হয়, সে সম্পর্কে এগুলি সাধারণ নির্দেশিকা।
ইনস্ট্রুমেন্টেড টেস্টে টেস্ট অ্যাপ্লিকেশনটি সেট করুন।
ইন্সট্রুমেন্টেড টেস্টে Hilt টেস্ট অ্যাপ্লিকেশন ব্যবহার করতে, আপনাকে একটি নতুন টেস্ট রানার কনফিগার করতে হবে। এর ফলে আপনার প্রোজেক্টের সমস্ত ইন্সট্রুমেন্টেড টেস্টের জন্য Hilt কাজ করবে। নিম্নলিখিত ধাপগুলো অনুসরণ করুন:
-
androidTestফোল্ডারেAndroidJUnitRunnerএক্সটেন্ড করে একটি কাস্টম ক্লাস তৈরি করুন। -
newApplicationফাংশনটি ওভাররাইড করুন এবং তৈরি করা Hilt টেস্ট অ্যাপ্লিকেশনটির নামটি পাস করুন।
কোটলিন
// A custom runner to set up the instrumented application class for tests. class CustomTestRunner : AndroidJUnitRunner() { override fun newApplication(cl: ClassLoader?, name: String?, context: Context?): Application { return super.newApplication(cl, HiltTestApplication::class.java.name, context) } }
জাভা
// A custom runner to set up the instrumented application class for tests. public final class CustomTestRunner extends AndroidJUnitRunner { @Override public Application newApplication(ClassLoader cl, String className, Context context) throws ClassNotFoundException, IllegalAccessException, InstantiationException { return super.newApplication(cl, HiltTestApplication.class.getName(), context); } }
এরপর, ইন্সট্রুমেন্টেড ইউনিট টেস্ট গাইডে বর্ণিত পদ্ধতি অনুযায়ী আপনার গ্রেডল ফাইলে এই টেস্ট রানারটি কনফিগার করুন। সম্পূর্ণ ক্লাসপাথ ব্যবহার করছেন কিনা তা নিশ্চিত করুন:
গ্রুভি
android { defaultConfig { // Replace com.example.android.dagger with your class path. testInstrumentationRunner "com.example.android.dagger.CustomTestRunner" } }
কোটলিন
android { defaultConfig { // Replace com.example.android.dagger with your class path. testInstrumentationRunner = "com.example.android.dagger.CustomTestRunner" } }
রোবোইলেকট্রিক টেস্টে টেস্ট অ্যাপ্লিকেশনটি সেট করুন।
আপনি যদি আপনার UI লেয়ার পরীক্ষা করার জন্য Robolectric ব্যবহার করেন, তাহলে robolectric.properties ফাইলে কোন অ্যাপ্লিকেশনটি ব্যবহার করবেন তা নির্দিষ্ট করে দিতে পারেন:
application = dagger.hilt.android.testing.HiltTestApplication
বিকল্পভাবে, আপনি রোবোইলেকট্রিকের @Config অ্যানোটেশন ব্যবহার করে প্রতিটি টেস্টে অ্যাপ্লিকেশনটি আলাদাভাবে কনফিগার করতে পারেন:
কোটলিন
@HiltAndroidTest @Config(application = HiltTestApplication::class) class SettingsActivityTest { @get:Rule var hiltRule = HiltAndroidRule(this) // Robolectric tests here. }
জাভা
@HiltAndroidTest @Config(application = HiltTestApplication.class) class SettingsActivityTest { @Rule public HiltAndroidRule hiltRule = new HiltAndroidRule(this); // Robolectric tests here. }
আপনি যদি 4.2-এর চেয়ে কম সংস্করণের অ্যান্ড্রয়েড গ্রেডল প্লাগইন ব্যবহার করেন, তাহলে আপনার মডিউলের build.gradle ফাইলে নিম্নলিখিত কনফিগারেশনটি প্রয়োগ করে স্থানীয় ইউনিট টেস্টে @AndroidEntryPoint ক্লাস রূপান্তর করা সক্ষম করুন:
গ্রুভি
hilt { enableTransformForLocalTests = true }
কোটলিন
hilt { enableTransformForLocalTests = true }
Hilt ডকুমেন্টেশনে enableTransformForLocalTests সম্পর্কে আরও তথ্য রয়েছে।
পরীক্ষার বৈশিষ্ট্য
আপনার টেস্টে ব্যবহারের জন্য হিল্ট প্রস্তুত হয়ে গেলে, আপনি টেস্টিং প্রক্রিয়াটিকে নিজের মতো করে সাজিয়ে নিতে এর বিভিন্ন ফিচার ব্যবহার করতে পারেন।
পরীক্ষায় প্রকারগুলি ইনজেক্ট করুন
কোনো টেস্টে টাইপ যুক্ত করতে, ফিল্ড ইনজেকশনের জন্য @Inject ব্যবহার করুন। Hilt-কে @Inject ফিল্ডগুলো পূরণ করতে বলার জন্য, hiltRule.inject() কল করুন।
যন্ত্রের সাহায্যে করা পরীক্ষার নিম্নলিখিত উদাহরণটি দেখুন:
কোটলিন
@HiltAndroidTest class SettingsActivityTest { @get:Rule var hiltRule = HiltAndroidRule(this) @Inject lateinit var analyticsAdapter: AnalyticsAdapter @Before fun init() { hiltRule.inject() } @Test fun `happy path`() { // Can already use analyticsAdapter here. } }
জাভা
@HiltAndroidTest public final class SettingsActivityTest { @Rule public HiltAndroidRule hiltRule = new HiltAndroidRule(this); @Inject AnalyticsAdapter analyticsAdapter; @Before public void init() { hiltRule.inject(); } @Test public void happyPath() { // Can already use analyticsAdapter here. } }
একটি বাইন্ডিং প্রতিস্থাপন করুন
যদি আপনাকে কোনো ডিপেন্ডেন্সির একটি নকল বা মক ইনস্ট্যান্স ইনজেক্ট করার প্রয়োজন হয়, তাহলে আপনাকে Hilt-কে বলতে হবে যেন এটি প্রোডাকশন কোডে ব্যবহৃত বাইন্ডিংটি ব্যবহার না করে এবং এর পরিবর্তে একটি ভিন্ন বাইন্ডিং ব্যবহার করে। একটি বাইন্ডিং প্রতিস্থাপন করতে, আপনাকে বাইন্ডিং ধারণকারী মডিউলটিকে এমন একটি টেস্ট মডিউল দিয়ে প্রতিস্থাপন করতে হবে, যেটিতে সেই বাইন্ডিংগুলো থাকবে যা আপনি টেস্টে ব্যবহার করতে চান।
উদাহরণস্বরূপ, ধরুন আপনার প্রোডাকশন কোড AnalyticsService জন্য নিম্নলিখিতভাবে একটি বাইন্ডিং ঘোষণা করে:
কোটলিন
@Module @InstallIn(SingletonComponent::class) abstract class AnalyticsModule { @Singleton @Binds abstract fun bindAnalyticsService( analyticsServiceImpl: AnalyticsServiceImpl ): AnalyticsService }
জাভা
@Module @InstallIn(SingletonComponent.class) public abstract class AnalyticsModule { @Singleton @Binds public abstract AnalyticsService bindAnalyticsService( AnalyticsServiceImpl analyticsServiceImpl ); }
টেস্টে AnalyticsService বাইন্ডিং প্রতিস্থাপন করতে, test বা androidTest ফোল্ডারে ফেক ডিপেন্ডেন্সি সহ একটি নতুন Hilt মডিউল তৈরি করুন এবং এটিকে @TestInstallIn দিয়ে অ্যানোটেট করুন। এর পরিবর্তে ঐ ফোল্ডারের সমস্ত টেস্টে ফেক ডিপেন্ডেন্সিটি ইনজেক্ট করা হবে।
কোটলিন
@Module @TestInstallIn( components = [SingletonComponent::class], replaces = [AnalyticsModule::class] ) abstract class FakeAnalyticsModule { @Singleton @Binds abstract fun bindAnalyticsService( fakeAnalyticsService: FakeAnalyticsService ): AnalyticsService }
জাভা
@Module @TestInstallIn( components = SingletonComponent.class, replaces = AnalyticsModule.class ) public abstract class FakeAnalyticsModule { @Singleton @Binds public abstract AnalyticsService bindAnalyticsService( FakeAnalyticsService fakeAnalyticsService ); }
একটি একক পরীক্ষায় একটি বাইন্ডিং প্রতিস্থাপন করুন
সমস্ত টেস্টের পরিবর্তে শুধুমাত্র একটি টেস্টে বাইন্ডিং প্রতিস্থাপন করতে, @UninstallModules অ্যানোটেশন ব্যবহার করে একটি টেস্ট থেকে Hilt মডিউল আনইনস্টল করুন এবং সেই টেস্টের ভিতরে একটি নতুন টেস্ট মডিউল তৈরি করুন।
পূর্ববর্তী সংস্করণের AnalyticsService উদাহরণটি অনুসরণ করে, প্রথমে টেস্ট ক্লাসে @UninstallModules অ্যানোটেশন ব্যবহার করে Hilt-কে প্রোডাকশন মডিউলটি উপেক্ষা করতে বলুন:
কোটলিন
@UninstallModules(AnalyticsModule::class) @HiltAndroidTest class SettingsActivityTest { ... }
জাভা
@UninstallModules(AnalyticsModule.class) @HiltAndroidTest public final class SettingsActivityTest { ... }
এরপরে, আপনাকে বাইন্ডিংটি প্রতিস্থাপন করতে হবে। টেস্ট ক্লাসের মধ্যে একটি নতুন মডিউল তৈরি করুন যা টেস্ট বাইন্ডিংটি সংজ্ঞায়িত করবে:
কোটলিন
@UninstallModules(AnalyticsModule::class) @HiltAndroidTest class SettingsActivityTest { @Module @InstallIn(SingletonComponent::class) abstract class TestModule { @Singleton @Binds abstract fun bindAnalyticsService( fakeAnalyticsService: FakeAnalyticsService ): AnalyticsService } ... }
জাভা
@UninstallModules(AnalyticsModule.class) @HiltAndroidTest public final class SettingsActivityTest { @Module @InstallIn(SingletonComponent.class) public abstract class TestModule { @Singleton @Binds public abstract AnalyticsService bindAnalyticsService( FakeAnalyticsService fakeAnalyticsService ); } ... }
এটি শুধুমাত্র একটি টেস্ট ক্লাসের বাইন্ডিং প্রতিস্থাপন করে। আপনি যদি সমস্ত টেস্ট ক্লাসের বাইন্ডিং প্রতিস্থাপন করতে চান, তাহলে উপরের বিভাগ থেকে @TestInstallIn অ্যানোটেশনটি ব্যবহার করুন। বিকল্পভাবে, আপনি রোবোইলেকট্রিক টেস্টের জন্য test মডিউলে, অথবা ইন্সট্রুমেন্টেড টেস্টের জন্য androidTest মডিউলে টেস্ট বাইন্ডিং রাখতে পারেন। যখনই সম্ভব @TestInstallIn ব্যবহার করার পরামর্শ দেওয়া হয়।
নতুন মূল্যবোধকে আবদ্ধ করা
আপনার টেস্টের ফিল্ডগুলোকে Hilt ডিপেন্ডেন্সি গ্রাফে সহজে বাইন্ড করতে @BindValue অ্যানোটেশনটি ব্যবহার করুন। কোনো ফিল্ডকে @BindValue দিয়ে অ্যানোটেট করলে, সেটি ঘোষিত ফিল্ড টাইপের অধীনে এবং সেই ফিল্ডের জন্য উপস্থিত যেকোনো কোয়ালিফায়ারসহ বাইন্ড হয়ে যাবে।
AnalyticsService উদাহরণে, আপনি @BindValue ব্যবহার করে AnalyticsService একটি নকল মান দিয়ে প্রতিস্থাপন করতে পারেন:
কোটলিন
@UninstallModules(AnalyticsModule::class) @HiltAndroidTest class SettingsActivityTest { @BindValue @JvmField val analyticsService: AnalyticsService = FakeAnalyticsService() ... }
জাভা
@UninstallModules(AnalyticsModule.class) @HiltAndroidTest class SettingsActivityTest { @BindValue AnalyticsService analyticsService = FakeAnalyticsService(); ... }
এটি আপনার টেস্টে বাইন্ডিং প্রতিস্থাপন এবং বাইন্ডিং রেফারেন্স করা উভয়কেই সহজ করে তোলে, কারণ এটি আপনাকে একই সাথে উভয় কাজ করার সুযোগ দেয়।
@BindValue কোয়ালিফায়ার এবং অন্যান্য টেস্টিং অ্যানোটেশনের সাথে কাজ করে। উদাহরণস্বরূপ, যদি আপনি Mockito-এর মতো টেস্টিং লাইব্রেরি ব্যবহার করেন, তাহলে একটি Robolectric টেস্টে এটি নিম্নরূপে ব্যবহার করতে পারেন:
কোটলিন
... class SettingsActivityTest { ... @BindValue @ExampleQualifier @Mock lateinit var qualifiedVariable: ExampleCustomType // Robolectric tests here }
জাভা
... class SettingsActivityTest { ... @BindValue @ExampleQualifier @Mock ExampleCustomType qualifiedVariable; // Robolectric tests here }
যদি আপনাকে একটি মাল্টিবাইন্ডিং যোগ করতে হয়, তাহলে আপনি @BindValue এর পরিবর্তে @BindValueIntoSet এবং @BindValueIntoMap অ্যানোটেশনগুলো ব্যবহার করতে পারেন। @BindValueIntoMap ব্যবহার করার জন্য আপনাকে ফিল্ডটিকে একটি ম্যাপ কী অ্যানোটেশন দিয়েও চিহ্নিত করতে হবে।
বিশেষ ক্ষেত্রে
হিল্ট অপ্রচলিত ব্যবহারের ক্ষেত্রগুলোকে সমর্থন করার জন্য বিভিন্ন বৈশিষ্ট্যও প্রদান করে।
পরীক্ষার জন্য কাস্টম অ্যাপ্লিকেশন
যদি আপনার টেস্ট অ্যাপ্লিকেশনটিকে অন্য কোনো অ্যাপ্লিকেশন এক্সটেন্ড করতে হয় এবং সেই কারণে আপনি HiltTestApplication ব্যবহার করতে না পারেন, তাহলে একটি নতুন ক্লাস বা ইন্টারফেসকে @CustomTestApplication দিয়ে অ্যানোটেট করুন এবং যে বেস ক্লাসটিকে আপনি তৈরি করা Hilt অ্যাপ্লিকেশনটির জন্য এক্সটেন্ড করতে চান, তার ভ্যালুটি পাস করে দিন।
@CustomTestApplication একটি Application ক্লাস তৈরি করবে যা Hilt দিয়ে পরীক্ষার জন্য প্রস্তুত এবং এটি আপনার প্যারামিটার হিসেবে দেওয়া অ্যাপ্লিকেশনটিকে এক্সটেন্ড করবে।
কোটলিন
@CustomTestApplication(BaseApplication::class) interface HiltTestApplication
জাভা
@CustomTestApplication(BaseApplication.class) interface HiltTestApplication { }
উদাহরণটিতে, Hilt, HiltTestApplication_Application নামের একটি Application তৈরি করে যা BaseApplication ক্লাসকে এক্সটেন্ড করে। সাধারণত, তৈরি হওয়া অ্যাপ্লিকেশনটির নাম হলো অ্যানোটেড ক্লাসের নামের শেষে _Application যুক্ত করা। টেস্ট অ্যাপ্লিকেশন অংশে বর্ণিত পদ্ধতি অনুযায়ী, আপনাকে অবশ্যই তৈরি হওয়া Hilt টেস্ট অ্যাপ্লিকেশনটিকে আপনার ইন্সট্রুমেন্টেড টেস্ট বা রোবোইলেকট্রিক টেস্টে চালানোর জন্য সেট করতে হবে।
আপনার ইনস্ট্রুমেন্টেড টেস্টে একাধিক TestRule অবজেক্ট
আপনার টেস্টে যদি অন্যান্য TestRule অবজেক্ট থাকে, তবে সবগুলো নিয়ম যাতে একসাথে কাজ করে তা নিশ্চিত করার একাধিক উপায় রয়েছে।
আপনি নিয়মগুলোকে নিম্নোক্তভাবে একত্রিত করতে পারেন:
কোটলিন
@HiltAndroidTest class SettingsActivityTest { @get:Rule var rule = RuleChain.outerRule(HiltAndroidRule(this)). around(SettingsActivityTestRule(...)) // UI tests here. }
জাভা
@HiltAndroidTest public final class SettingsActivityTest { @Rule public RuleChain rule = RuleChain.outerRule(new HiltAndroidRule(this)) .around(new SettingsActivityTestRule(...)); // UI tests here. }
বিকল্পভাবে, আপনি উভয় নিয়ম একই স্তরে ব্যবহার করতে পারেন, তবে শর্ত হলো HiltAndroidRule টি প্রথমে কার্যকর হতে হবে। @Rule অ্যানোটেশনে order অ্যাট্রিবিউট ব্যবহার করে কার্যকর হওয়ার ক্রম নির্দিষ্ট করুন। এটি শুধুমাত্র JUnit সংস্করণ 4.13 বা তার উচ্চতর সংস্করণে কাজ করে:
কোটলিন
@HiltAndroidTest class SettingsActivityTest { @get:Rule(order = 0) var hiltRule = HiltAndroidRule(this) @get:Rule(order = 1) var settingsActivityTestRule = SettingsActivityTestRule(...) // UI tests here. }
জাভা
@HiltAndroidTest public final class SettingsActivityTest { @Rule(order = 0) public HiltAndroidRule hiltRule = new HiltAndroidRule(this); @Rule(order = 1) public SettingsActivityTestRule settingsActivityTestRule = new SettingsActivityTestRule(...); // UI tests here. }
কন্টেইনারে লঞ্চফ্র্যাগমেন্ট
Hilt-এর সাথে androidx.fragment:fragment-testing লাইব্রেরির launchFragmentInContainer ব্যবহার করা সম্ভব নয়, কারণ এটি এমন একটি অ্যাক্টিভিটির উপর নির্ভর করে যেটি @AndroidEntryPoint দিয়ে অ্যানোটেট করা নেই।
এর পরিবর্তে architecture-samples গিটহাব রিপোজিটরি থেকে launchFragmentInHiltContainer কোডটি ব্যবহার করুন।
সিঙ্গেলটন কম্পোনেন্টটি উপলব্ধ হওয়ার আগে একটি এন্ট্রি পয়েন্ট ব্যবহার করুন।
যখন কোনো হিল্ট টেস্টে সিঙ্গেলটন কম্পোনেন্টটি উপলব্ধ হওয়ার আগেই একটি হিল্ট এন্ট্রি পয়েন্ট তৈরি করার প্রয়োজন হয়, তখন @EarlyEntryPoint অ্যানোটেশনটি একটি বিকল্প পথ প্রদান করে।
হিল্ট ডকুমেন্টেশনে @EarlyEntryPoint সম্পর্কে আরও তথ্য রয়েছে।