Bir sınıf konstruktörü bünyesinde oluşturulan nesne, bu sınıfın test edilmesini zorlaştırır. Bunun bir örneğini EmployeeManager sınıfında görmekteyiz. Sınıf değişkeni olan dao konstruktör bünyesinde oluşturulmaktadır.
package com.kurumsaljava.refactoring.parameterizeConstructor; public class EmployeeManager { private EmployeeDao dao; public EmployeeManager() { this.dao = new EmployeeDao(); } }
EmployeeManager sınıfının test edilebilmesi için EmployeeDao‘nun kullanılması zorunludur. EmployeeDao burada dolaylı bir bağımlılık teşkil etmektedir. Büyük bir ihtimalle EmployeeDao sınıfı çalışır durumda olan bir veri tabanına ihtiyaç duymaktadır. Bu durum EmployeeManager sınıfının test edilebilirliğini zora sokmaktadır.
package com.kurumsaljava.refactoring.parameterizeConstructor; public class EmployeeManagerTest { public void testEmployeeManager() { EmployeeManager manager = new EmployeeManager(); Assert.assertTrue(manager.pay() == 0); } }
Bir parametrik konstruktör oluşturarak bu sorunu ortadan kaldırabiliriz.
package com.kurumsaljava.refactoring.parameterizeConstructor; public class EmployeeManager { private EmployeeDao dao; public EmployeeManager(final EmployeeDao myDao) { this.dao = myDao; } public int pay() { return 0; } }
EmployeeManager sınıfının kontruktörünü EmployeeDao sınıfından bir parametre ile genişletiyoruz. Bu şekilde ihtiyaç duyduğumuz EmployeeDao sınıfından bir nesneyi dışardan enjekte edebiliriz. EmployeeDao sınıfının bir interface sınıfı olduğunu düşünürsek, testlerimiz bünyesinde kullanılmak üzere FakeEmployeeDaoImpl ismini taşıyan ve veri tabanına bağımlılığı bulunmayan yeni bir implementasyon oluşturabiliriz.
package com.kurumsaljava.refactoring.parameterizeConstructor; public class EmployeeTest { public void testEmployeeManager() { EmployeeDao dao = new FakeEmployeeDaoImpl(); EmployeeManager manager = new EmployeeManager(dao); Assert.assertTrue(manager.pay() == 0); } }
EOF (End Of Fun)
Özcan Acar
Refactoring kategorisinden son yazılar
- Kataların Anası - June 30th, 2012
- Yeni Sınıf Oluşturma (Extract Class) - October 29th, 2011
- Koşullu Mantığın Komut İle Değiştirilmesi (Replace Conditional Dispatcher With Command) - October 26th, 2011
- Metodu Metot Nesnesine Dönüştürme (Replace Method with Method Object) - October 24th, 2011
- Refactoring Oturumu (Video) - October 20th, 2011
- Geçici Değişkenlerin Sorguya Dönüştürülmesi (Replace Temp with Query) - October 19th, 2011
- Parametrele Değer Atamasının Kaldırılması (Remove Assignments to Parameters) - October 16th, 2011
- Yeni Metot Oluşturma (Extract Method) - October 16th, 2011
- Koşulları Parçalarına Ayırma (Reverse Conditional) - October 15th, 2011