Singleton adalah pendekatan yang lebih baik dari perspektif pengujian. Tidak seperti kelas statis, singleton dapat mengimplementasikan antarmuka dan Anda dapat menggunakan contoh tiruan dan menyuntikkan mereka.
Dalam contoh di bawah ini saya akan menggambarkan ini. Misalkan Anda memiliki metode isGoodPrice () yang menggunakan metode getPrice () dan Anda menerapkan getPrice () sebagai metode dalam singleton.
singleton yang menyediakan fungsionalitas getPrice:
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;
}
}
Penggunaan getPrice:
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();
}
Implementasi Final Singleton:
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;
}
kelas tes:
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);
}
}
Jika kita mengambil alternatif menggunakan metode statis untuk mengimplementasikan getPrice (), sulit untuk mengejek getPrice (). Anda dapat mengejek statis dengan mengejek listrik, namun tidak semua produk dapat menggunakannya.
getInstance()
metode setiap kali Anda ingin menggunakannya (walaupun mungkin dalam kebanyakan kasus itu tidak masalah ).