Parametrik Konstruktör (Parameterize Constructor)

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

Share Button
0.00 avg. rating (0% score) - 0 votes

Bir cevap yazın