싱글턴 패턴이란?
장점
단점
이번에는 단점들 중 테스트 하기 어려운 이유 자세히 알아보자.
싱글턴 인스턴스를 mock 구현으로 대체할 수 없다.
싱글톤 인스턴스는 자원을 공유하고 있기 때문에 테스트가 결정적으로 격리된 환경에서 수행되려면 매번 인스턴스의 상태를 초기화 시켜주어야 한다. 그렇지 않으면 애플리케이션 전역에서 상태를 공유하기 때문에 테스트가 온전하게 수행되지 못한다.
Elvis Class
public class Elvis {
private static final Elvis INSTANCE = new Elvis();
private Elvis() { }
public static Elvis getInstance() { return INSTANCE; }
public void leaveTheBuilding() {
System.out.println("Whoa baby, I'm outta here!");
}
public void sing() {
System.out.println("sing~~");
}
}
Concert Class
class ConcertTest {
@Test
void perform() {
Concert concert = new Concert(Elvis.getInstance());
concert.perform();
assertTrue(concert.isLightsOn());
assertTrue(concert.isMainStateOpen());
}
}
이번에는 테스트 비용을 줄이기 위해 인터페이스를 구현해보자.
Elvis Class
public class Elvis implements IElvis{
private static final Elvis INSTANCE = new Elvis();
private Elvis() { }
public static Elvis getInstance() { return INSTANCE; }
public void leaveTheBuilding() {
System.out.println("Whoa baby, I'm outta here!");
}
@Override
public void sing() {
System.out.println("sing~~");
}
}
Concert Class
public class Concert {
private boolean lightsOn;
private boolean mainStateOpen;
private IElvis elvis;
public Concert(IElvis elvis) {
this.elvis = elvis;
}
public void perform() {
mainStateOpen = true;
lightsOn = true;
elvis.sing();
}
public boolean isLightsOn() {
return lightsOn;
}
public boolean isMainStateOpen() {
return mainStateOpen;
}
}
MockElvis Class
public class MockElvis implements IElvis {
@Override
public void leaveTheBuilding() {
System.out.println("Whoa baby, I'm outta here!");
}
@Override
public void sing() {
System.out.println("sing~~");
}
}
ConcertTest
class ConcertTest {
@Test
void perform() {
Concert concert = new Concert(new MockElvis());
concert.perform();
assertTrue(concert.isLightsOn());
assertTrue(concert.isMainStateOpen());
}
}
이런 유용한 정보를 나눠주셔서 감사합니다.