JUnit Rule, test metotlarımıza daha esnek özellikler katmamızı sağlar. Her test metodu çalışmadan önce yapılması gereken işlemler varsa(@Before) veya her test metodunun sonunda yapılması gereken işlemler varsa(@After) @Rule notasyonu(annotation) kullanılabilir. Ayrıca @ClassRule ile test sınıflarını için @BeforeClass ve @AfterCLass işlemleri için özelleştirmeler yapılabilir. JUnit bize sunduğu bazı hazır yapılar vardır. Hepsine https://github.com/junit-team/junit4/wiki/Rules adresinden ulaşabilirsiniz.
JUnit’in hazır sunduğu yapılardan TemporaryFolder ile başlayalım. TemporaryFolder ile test metotlarımızda test amaçlı dosyalar oluşturulabilir ve bu dosyalar testin sonunda silinebilir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public class HasTempFolder { @Rule public TemporaryFolder folder = new TemporaryFolder(); @Test public void testUsingTempFolder() throws IOException { System.out.println("testUsingTempFolder() için test başladı...!"); File createdFile = folder.newFile("myfile.txt"); File createdFolder = folder.newFolder("subfolder"); assertTrue(createdFile.exists()); System.out.println("myFile.txt oluştu mu: " + createdFile.exists()); assertTrue(createdFolder.exists()); System.out.println("subfolder oluştu mu: " + createdFolder.exists()); System.out.println("testUsingTempFolder() için test bitti...!"); } } |
1 2 3 4 |
testUsingTempFolder() için test başladı...! myFile.txt oluştu mu: true subfolder oluştu mu: true testUsingTempFolder() için test bitti...! |
HasTempFolder sınıfında folder isminde bir @Rule notasyonlu değişken oluşturuyoruz. Bu değişkeni testUsingTempFolder isminde metotda kullanıyoruz. newFile metoduyla oluşturacağımız dosyayı, newFolder metoduyla oluşturacağımız klasörü tanımladık. Bu dosyaların oluşup oluşmadığını exist metoduyla test ettikten sonra ekran çıktılarını verip metodumuzu tamamlamış oluyoruz. Bu konuyu daha iyi kavrayabilmek için CustomRule ile kendi esnek yapılarımızı oluşturalım.
CustomRule
Yapacağımız örnekte her test metodunun çalışmasından önce ve sonrasında metot isminin ekrana yazdırılmasını sağlayacağız.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public class NamePrintRule implements TestRule{ @Override public Statement apply(Statement base, Description description) { return new Statement() { @Override public void evaluate() throws Throwable { System.out.println(description.getMethodName() + "() için test başladı...!"); base.evaluate(); System.out.println(description.getMethodName() + "() için test bitti...!"); } }; } } |
TestRule implement olarak NamePrintRule sınıfı almaktadır. Bu sınıfın apply isminde ki metodunu @Override notasyonu ile eziyoruz. Oluşan metot içersine return new Statement() yazarak evaluate metodunun oluşmasını sağlıyoruz. base.evaluate() öncesinde yazılanlar @Before notasyonuna, sonrasında yazılanlar @After notasyonunu işaret etmektedir. Bizde bu özelliklerden yararlanarak test metodunun başladığını ve bittiğini bildiriyoruz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
public class HasTempFolder { @Rule public TemporaryFolder folder = new TemporaryFolder(); @Rule public NamePrintRule nameRule = new NamePrintRule(); @Test public void testUsingTempFile() throws IOException { File createdFile = folder.newFile("myfile.txt"); assertTrue(createdFile.exists()); System.out.println("myFile.txt oluştu mu: " + createdFile.exists()); } @Test public void testUsingTempFolder() throws IOException { File createdFolder = folder.newFolder("subfolder"); assertTrue(createdFolder.exists()); System.out.println("subfolder oluştu mu: " + createdFolder.exists()); } } |
1 2 3 4 5 6 7 |
testUsingTempFolder() için test başladı...! subfolder oluştu mu: true testUsingTempFolder() için test bitti...! testUsingTempFile() için test başladı...! myFile.txt oluştu mu: true testUsingTempFile() için test bitti...! |
Daha önce yazdığımız ekran metotlarını artık yazmamıza gerek kalmadı. Kullanmak istediğiniz özelliklere göre kendi @Rule yapılarınızı oluşturabilirsiniz. Kodun esnekliği açısından büyük fayda sağlayacaktır.