جعبه ابزار تست نویسی من در جاوا

ما جاوا کاریم!

برای تست نوشتن از 4 JUnit استفاده می کنم و برای assert کردن از hamcrest.

ولی چون هر دفعه یادم میره چی و باید از کجا import کنم، و این کتابخونه ها هم یکم اشتراکات دارن، یک سری مقدمات و این جا می نویسم که یادم نره.

سوال ۱: چطور import static کنیم؟

متد های زیادی و لازم می شه که import static کنیم. برای این کار، اسم متد و می نویسیم و بعد `alt+ctrl+space‍` و می زنیم. وظیفه ی این hotkey باز کردن Import Settings است.

press alt+ctrl+space to open import settings. then use alt+enter for import static
press alt+ctrl+space to open import settings. then use alt+enter for import static

در حالتی که منو import settings باز شده، با فشردن alt+enter، متد انتخاب شده static import می شود.

همچنین اگر یک متد static را با استفاده از import کردن کلاس آن استفاده کرده باشیم، می توانیم با alt+enter تبدیل به static import کنیم.

press alt+enter to static import static methods of a class
press alt+enter to static import static methods of a class

سوال ۲: از کدام متد های assertThat استفاده کنیم؟

دو متد assertThat معمول برای استفاده از Matcher های hamcrest وجود دارد. این سه متد استاتیک عبارتند از:

public static <T> void assertThat(T actual, Matcher<? super T> matcher)
public static <T> void assertThat(String reason, T actual, Matcher<? super T> matcher)

این سه متد، در هر دو کلاس زیر وجود دارند. از کدام استفاده کنیم؟

org.junit.Assert
org.hamcrest.MatcherAssert

پاسخ:

متد های موجود در org.junit.Assert هم متد های موجود در org.hamcrest.MatcherAssert را فراخوانی می کنند. با توجه به این که متد های کاربردی دیگری (سایر assert ها و همچنین متد fail) در این کلاس وجود دارد، بهتر است تمام متد های موجود در این کلاس import static شوند.

سوال ۳: از کدام Matcher ها استفاده کنیم؟

متد های معمول matcher مانند is یا equalTo در دو کلاس زیر وجود دارند.

org.hamcrest.Matchers
org.hamcrest.CoreMatchers

برای فهم تفاوت این کلاس ها به نکات زیر دقت کنید:

  1. کلاس های اصلی Matcher داخل پکیج با نام org.hamcrest.core تعریف شده اند (مانند Is که دارای متد استاتیک is است.) و تمام متد های موجود در هر دو کلاس فوق، فراخوانی ها را به Matcher های اصلی موجود در org.hamcrest.core دلیگیت (delegate) می گنند.
  2. کلاس Matchers در hamcrest-all وجود دارد اما در hamcrest-core وجود ندارد. یعنی اگر در حال استفاده از hamcrest-core هستید، امکان استفاده از متد های موجود در Matchers را نخواهید داشت.
  3. در Matchers متد های بیشتری وجود دارد.
  4. همان طور که در شرح توزیع های hamcrst قدیمی (کمتر از نسخه ی 2) در وبلاگ این فریم ورک شرح داده شده است، hamcrest-all مجموع همه jar فایل هایی است که با عنوان hamcrest منتشر می شد.

در نتیجه می توانیم تمام متد های موجود در Matchers را static imort کنیم.

خلاصه import ها:

import org.junit.*;
import static org.junit.Assert.*;
import static org.hamcrest.Matchers.*;

اعمال تنظیمات مطلوب روی IntelliJ Idea

معمولا این دو Live Template را هم به Intellij اضافه می کنم:

tstimport
import org.junit.*;
import static org.junit.Assert.*;
import static org.hamcrest.Matchers.*;

و

tstmethod
@Test
@Ignore
public void $methodName$() {
    fail(&quotnot implemented yet&quot);
}

همچنین در بخش File and Code Templates -> Code -> JUnit4 Test Clss می توان تمپلیت فایل را به این شکل تغییر داد:

import org.junit.*;
import static org.junit.Assert.*;
import static org.hamcrest.Matchers.*;
#parse(&quotFile Header.java&quot)
public class ${NAME} {
    @Test
    public void nothing() {

     }
    ${BODY}
}

در این صورت وقتی روی کلاس got to Test می زنیم (ctrl+shift+T) و یک کلاس JUnit 4 جدید ایجاد می کنیم، از قالب فوق استفاده می شود. برای رفتن از کلاس تست به Subjetct Class هم می توان از ctrl+shift+T استفاده کرد.