JUnit Excepted Exception özelliği ile beklenilen hataların oluşup oluşmadığını, beklenilen hatada hangi mesajı vermesi gerektiğini tanımlarız.
Aşağıda ki örnekte 2 adet test metodumu oluşturduk ve bu metotların içinde ki değerlerin hata vermesi gerektiğini tanımladık.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
public class ExceptionTest { @Test(expected = NullPointerException.class) public void testNullPointer() { System.out.println("Begin testNullPointer()..."); Integer sayi = null; sayi += 5; System.out.println("End testNullPointer()..."); } @Test(expected = IndexOutOfBoundsException.class) public void testEmptyList() { System.out.println("Begin testEmptyList()..."); new ArrayList<>().get(0); System.out.println("End testEmptyList()..."); } } |
1 2 |
Begin testEmptyList()... Begin testNullPointer()... |
Metot içersinde yazılan kodlarda hangi hata sınıfının çalışması gerektiğini @Test(expected=<ExceptionSinifi.class> notasyonunda tanımlıyoruz.
İlk örneğimizde NullPointerException hatası fırlatması gerektiğini tanımladık. sayi isimli değişkenimize null değer atadıktan sonra 5 sayısını ilave ettik. Null bir değerin üzerine sayı ilave edemeyeceğimiz için beklediğimiz hatayı aldık. Beklenilen hata durumunu aldığımız için end mesajımızı ekrana yazdıramadık. Expected beklediğimiz bir test metodunda işlemlerimiz hata vermeseydi, JUnit bize AssertException mesajıyla test metodunun başarısız olduğunu belirtecekti.
testEmptyList örneğimizde ise içinde herhangi bir öğe olmayan listenin 0’ncı indisinden veri çekmeye çalıştık. Böyle bir durum mümkün olmadığı için beklediğimiz IndexOutOfBoundsException hatasını alıyoruz ve bu testide başarıyla tamamlıyoruz.
Aşağıda ki exeption test örneğimizde ise try catch içersinde çalışan metotlarımızın belirtilen noktada her zaman hataya düşmesini ve hatanın düştüğü yerde beklediğimiz mesajı alıp almadığımızı kontrol ediyoruz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
public class ExceptionTest { @Test public void testNullPointer() { System.out.println("Begin testNullPointer()..."); try { Integer sayi = null; sayi += 5; fail(); } catch (NullPointerException e) { assertTrue(e instanceof NullPointerException); System.out.println("End testNullPointer()..."); } } @Test public void testEmptyList() { System.out.println("Begin testEmptyList()..."); try{ new ArrayList<>().get(0); fail(); } catch(IndexOutOfBoundsException e){ assertThat(e.getMessage(), is("Index: 0, Size: 0")); System.out.println("End testEmptyList()..."); } } } |
testNullPointer metodumuzda null değere 5 sayısını ekleme sonrası catch içersine girecektir. catch içersinde hata tipi instanceof ile kontrol ederek testimizi başarıyla tamamlıyoruz. Eğer hata beklediğimiz halde testimizin, ilgili noktada hataya düşüp düşmediğini anlamak istersek fail() metodunu kullanmamız gerekmektedir. Metodumuzda normal şartlarda fail() metoduna ulaşmadan hataya düşmesi gerekmektedir. Fakat hataya düşmemesinin bir hata olduğunu belirtmemiz için fail() metodunu tanımlıyoruz. Böylece catch içine düşmek yerine fail() bulunan satıra gelindiğinde test AssertionError hata mesajını verir. Bunun anlamı hata yakalama testinin başarısız olduğudur.
testEmptyList test metodumuzda ise boş bir listenin 0’ncı satırında hataya düşmesi gerektiğini ve bu hatanın mesajının “Index: 0, Size: 0” olması gerektiğidir. Burada hata mesajını belirtmemizin nedeni bir Exception sınıfında birden fazla hata mesajının olmasıdır. Böylece beklediğimiz hatanın olup olmadığınıda anlamış oluruz.
Test metotlarımıza davranışlar ekleyebileceğimiz @Rule notasyonunuda kullanabiliriz. İlerleyen konularımızda bahsedeceğimiz bu yapı metotlarımızın daha esnek bir yapıya sahip olmasını sağlamaktadır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public class ExceptionTest { @Rule public ExpectedException thrown = ExpectedException.none(); @Test public void testEmptyList() { System.out.println("Begin testEmptyList()..."); thrown.expect(IndexOutOfBoundsException.class); thrown.expectMessage(containsString("Index: 0, Size: 0")); new ArrayList<>().get(0); System.out.println("End testEmptyList()..."); } } |
Yukarıda ki örneğimizde thrown isimli, ExpectedException tipinde bir değişken tanımlanıyor. none metodu aracılığı ile new işlemi metot içersinden gönderiliyor. @Rule aracılığı ile bu davranışı her metotda kullanmamızı sağlıyoruz. Metodumuzun içersinde expect aracılığıyla bu metodun hangi tip Exception vereceği, expectMessage ile de mesaj içeriği paylaşılıyor. Bu metot doğru bir şekilde çalışarak görevini tamamlıyor.