Projeleri test ederken karşılaştığımız bir problem de private ve void methodların özel durumlarıdır. Private methoda erişemediğimizden, Void methodun da birşey döndürmediğinden bu sonuç ortaya çıkar. Void method için aslında yapılabilecek çok bir şey yok, kullandığı global değişkenleri Mockit kütüphanesinin getField() fonksiyonu ile kontrol edebiliriz.
String actual = getField(instance, "exportData");
actual : Kontrol edeceğimiz parametre
instance : Parametresini çekeceğimiz obje
exportData : Parametrenin adı
Bundan sonra assertEqual fonksiyonu ile karşılaştırma yapılabilir. Private methodları çağırmak için de aşağıdaki kodu kullanabiliriz.
...
...Class c = Class.forName("com.layers.drivers.DataDriverImpl");
Method methodParse = c.getDeclaredMethod("parseDataToExportData", new Class[]{Collection.class,Collection.class}); // Fonksiyonun adı ve aldığı parametrelerin tipi
methodParse.setAccessible(true);
Object objParse = c.newInstance();
setField(objParse, "dataExportData", mockDataExportData); // Fonksiyonun kullandığı bir global parametreyi kendi parametremizle değiştirme
methodParse.invoke(objParse, new Object[] {albumModels,genreModels}); // Fonksiyonun aldığı parametreler
...
...
Bu konuda başka bir örneğin bulunduğu linki aşağıda veriyorum. Yalnız bu linkteki örnekteki kodu kullanmak için method.setAccessible(true) kodunu eklemeniz gerekiyor, çünkü private method çalıştırmak için önce accessible yapmamız gerekiyor.
http://www.java2s.com/Tutorial/Java/0125__Reflection/Callaclassmethodwith2arguments.htm
Şimdilik bu kadar. Kafanıza takılan soruları yazarsanız beraber çözüm bulmaya çalışırız.
Herkese sevgiler, saygılar.
Hiç yorum yok:
Yorum Gönder