Singleton, test perspektifinden daha iyi bir yaklaşımdır. Statik sınıflardan farklı olarak, singleton arabirimleri uygulayabilir ve sahte örneği kullanabilir ve enjekte edebilirsiniz.
Aşağıdaki örnekte bunu açıklayacağım. GetPrice () yöntemini kullanan isGoodPrice () yönteminiz olduğunu ve tek birtonda yöntem olarak getPrice () yöntemini uyguladığınızı varsayalım.
getPrice işlevselliğini sağlayan singleton:
public class SupportedVersionSingelton {
private static ICalculator instance = null;
private SupportedVersionSingelton(){
}
public static ICalculator getInstance(){
if(instance == null){
instance = new SupportedVersionSingelton();
}
return instance;
}
@Override
public int getPrice() {
// calculate price logic here
return 0;
}
}
GetPrice kullanımı:
public class Advisor {
public boolean isGoodDeal(){
boolean isGoodDeal = false;
ICalculator supportedVersion = SupportedVersionSingelton.getInstance();
int price = supportedVersion.getPrice();
// logic to determine if price is a good deal.
if(price < 5){
isGoodDeal = true;
}
return isGoodDeal;
}
}
In case you would like to test the method isGoodPrice , with mocking the getPrice() method you could do it by:
Make your singleton implement an interface and inject it.
public interface ICalculator {
int getPrice();
}
Final Singleton uygulaması:
public class SupportedVersionSingelton implements ICalculator {
private static ICalculator instance = null;
private SupportedVersionSingelton(){
}
public static ICalculator getInstance(){
if(instance == null){
instance = new SupportedVersionSingelton();
}
return instance;
}
@Override
public int getPrice() {
return 0;
}
// for testing purpose
public static void setInstance(ICalculator mockObject){
if(instance != null ){
instance = mockObject;
}
test sınıfı:
public class TestCalculation {
class SupportedVersionDouble implements ICalculator{
@Override
public int getPrice() {
return 1;
}
}
@Before
public void setUp() throws Exception {
ICalculator supportedVersionDouble = new SupportedVersionDouble();
SupportedVersionSingelton.setInstance(supportedVersionDouble);
}
@Test
public void test() {
Advisor advidor = new Advisor();
boolean isGoodDeal = advidor.isGoodDeal();
Assert.assertEquals(isGoodDeal, true);
}
}
GetPrice () öğesini uygulamak için statik yöntem kullanma alternatifini kullanmamız durumunda, getPrice () alay etmek zordu. Statik güç taklidi ile alay edebilirsiniz, ancak tüm ürünler bunu kullanamaz.
getInstance()
(muhtemelen çoğu durumda önemli değildir ).