موارد تست خود را با تزریق وابستگی خودکار، با حسن نیت از JUnit، تمیز کنید.
هدف از تست واحد شناسایی خطاهای یک برنامه در اسرع وقت است. اگرچه چندین کانال ممکن است شما را به یک هدف هدایت کنند، اما باید از کارآمدترین مسیر استفاده کنید.
یک مجموعه آزمایشی JUnit ممکن است چندین کلاس آزمایشی داشته باشد که به دادههای یکسانی نیاز دارند، اما شما نمیتوانید از دادههای آزمایشی استفاده مجدد کنید. در نسخههای قبلی JUnit، یک رویکرد خوب این بود که یک متد کاربردی ایجاد کنید، سپس هر بار که یک کلاس آزمایشی به دادههای خود نیاز داشت، آن متد را فراخوانی کرد.
JUnit 5 یک رویکرد کارآمدتر برای این مشکل ارائه می دهد: تزریق وابستگی (DI).
تزریق وابستگی چیست؟
DI یک الگوی طراحی است که در آن یک شی وابستگی های یک شی دیگر را تامین می کند. هنگامی که در حال ساختن یک برنامه جاوا هستید، ممکن است کلاسی داشته باشید که به شیئی بستگی دارد که کلاس دیگری برای انجام عملکرد خود ایجاد می کند.
قبل از تزریق وابستگی، برای استفاده از یک شی از یک کلاس دیگر، باید یک نمونه جدید از آن شی در کلاسی که به آن وابسته است ایجاد کنید. بنابراین، اگر چندین کلاس دارید که به یک شی وابسته هستند، باید چندین نمونه از آن را در کلاسهای وابسته ایجاد کنید.
DI به شما امکان می دهد از یک شی در یک کلاس وابسته استفاده کنید، بدون اینکه نمونه جدیدی از آن در آن کلاس ایجاد کنید.
تزریق وابستگی در JUnit 5
JUnit 5 به شما امکان می دهد وابستگی ها را هم در روش های تست و هم در سازنده ها تزریق کنید. این مهم است زیرا نسخههای قبلی چارچوب به روشهای آزمایش یا سازندهها اجازه نمیدادند پارامتر داشته باشند.
JUnit 5 به شما امکان می دهد هر تعداد پارامتر را که دوست دارید تزریق کنید. تنها نکته این است که ParameterResolver API باید بتواند هر پارامتر را در زمان اجرا حل کند. JUnit در حال حاضر دارای سه حل کننده پارامتر داخلی است که به طور خودکار از آنها استفاده می کند. برای استفاده از هر حلکننده دیگری، باید با استفاده از حاشیهنویسی @ExtendWith آن را به صراحت ثبت کنید.
تزریق وابستگی ها در JUnit
این برنامه نمونه از یکی از پارامترهای داخلی JUnit (TestInfoParameterResolver) استفاده می کند تا نشان دهد که چگونه می توانید یک وابستگی را به یک تست JUnit 5 تزریق کنید. TestInfoParameterResolver اشیاء متعلق به رابط TestInfo را حل می کند. بنابراین، JUnit 5 یک نمونه از رابط TestInfo را به هر متد یا سازنده ای که از آن استفاده می کند، ارائه می دهد.
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInfo;
class InfoTestInterfaceTest {
// Injecting a testInfo object into the InfoTestInterfaceTest constructor
InfoTestInterfaceTest(TestInfo testInfo) {
assertEquals("InfoTestInterfaceTest", testInfo.getDisplayName());
}
// Injecting a testInfo object into methods
void testMethodName(TestInfo testInfo) {
assertEquals("testMethodName(TestInfo)", testInfo.getDisplayName());
}
("method using the annotation")
void testMethodNameTwo(TestInfo testInfo) {
assertEquals("method using the annotation", testInfo.getDisplayName());
}
}
تست JUnit در بالا نحوه تزریق یک شی به سازنده و دو روش را نشان می دهد. رابط JUnit TestInfo دارای چهار روش است که می توانید با شی آن استفاده کنید.
متد getDisplayName() مفیدترین است. نام نمایشی روش آزمایشی یا سازنده فعلی را برمی گرداند. به طور پیش فرض، این نام بر اساس کلاس است. اما اگر از حاشیه نویسی @DisplayName استفاده کنید، متد getDisplayName() آن متن را برمی گرداند.
کلاس تست بالا گزارش تست زیر را تولید می کند:
از DI در @Before و @After Methods استفاده کنید
چهار نوع دیگر از روش های حاشیه نویسی JUnit وجود دارد که از وابستگی ها پشتیبانی می کنند. اینها حاشیه نویسی های @BeforeAll، @BeforeEach، @AfterAll و @AfterEach هستند. مانند متد @Test، تنها کاری که باید انجام دهید این است که یک شی را به هر یک از متدهای قبل یا بعد به عنوان پارامتر ارسال کنید، و شما آماده هستید.
حاشیهنویسیهای @Before و @After مهم هستند، زیرا به شما کمک میکنند تا کد تست کارآمدتری ایجاد کنید. داشتن قابلیت تزریق وابستگی به این روش ها، کد تست شما را بیشتر بهبود می بخشد.