Java’da private metodlari test etmek

Arada sırada Java ünite testlerinde private metodları da test etmek gerekir. Hatta fonksiyonel bir bakış açısıyla, bir sınıftaki tüm private metodları teste dahil etmek de gerekir diyebiliriz. Gerçi bu fikre karşı çıkmak isteyenler, bir sınıfın API’ının o sınıftaki public metodlar olduğunu ve sadece onların test edilmesinin yeterli olacağını söyleyebilirler ama ben elimden geldiği kadar tüm metodlarımı kontrol etmek istiyorum.

Reflection API

Bu durumda JUnit gibi bir kütüphane ile çalışırken kullanılabilecek basit bir yöntem var. Tek yapmanız gereken, ilgili metodunuzu Reflection API yordamıyla bulmak, onun erişilebilirliği ile ilgili kısıtı kaldırmak ve sonra gene Reflection kullanarak çalıştırmanızdır. Sonrasında Assert nesnesi ile istediğiniz şekilde sonuç kontrolü yapabilirsiniz.

Basit bir örnek vermek gerekirse:

Örnek sınıf:

public class BaseballElimination {

 private final int numberOfTeams;

 private int[] wins;
 private int[] losses;
 private int[] remaining;
 private int[][] gamesAgaints;
 private String[] teams;

 private int findIndexOfTeam(String team) {
     for (int i = 0; i < numberOfTeams; i++) {
         if (teams[i].equals(team)) {
             return i;
         }
     }

     throw new IllegalArgumentException("team not valid");
 }
}

Örnek test:


@Test
public void testIndex() throws Exception {

    Method indexMethod = BaseballElimination.class.getDeclaredMethod("findIndexOfTeam", String.class);
    indexMethod.setAccessible(true);
    int index = (Integer) indexMethod.invoke(division, "Atlanta");

    Assert.assertEquals(0, index);
}

Gördüğünüz gibi, 3 satır kod yazmak yeterli, herkesi başarılı ünite testleri!

Ekleme, eger statik metodlari test etmek istiyorsaniz, tek yapmaniz gereken indexMethod.invoke() metoduna null gondermek.