【发布时间】:2017-10-26 12:21:15
【问题描述】:
当我们运行 DrawerOpenTest.java 时,它会抛出 StackOverflow 错误,而我们希望测试用例能够通过。而当 DrawerOpen 类为单例时,assertThat(actualState, is(expectedState));在测试用例中也应该是正确的。
请注意,“状态”是与 3 个基本方法的接口。
DrawerOpenTest 类
import static org.hamcrest.CoreMatchers.*;
import org.junit.*;
public class DrawerOpenTest {
@Test
public void openCloseButtonPushedPositiveTest(){
DVDPlayer cut = DVDPlayer.getInstance(DrawerOpen.getInstance());
State expectedState = DrawerClosedNotPlaying.getInstance();
State actualState = cut.openCloseButtonPushed();
assertThat(actualState, is(sameInstance(expectedState)));
}
}
DrawerOpen 类
public class DrawerOpen implements State {
private DVDPlayer player = DVDPlayer.getInstance(DrawerOpen.getInstance());
private static State state;
private DrawerOpen() {}
public static State getInstance() {
if(state == null)
state = new DrawerOpen();
return state;
}
@Override
public void openCloseButtonPushed() {
player.close();
player.changeState(DrawerClosedNotPlaying.getInstance());
}
@Override
public void playButtonPushed() {
player.close();
player.play();
player.changeState(DrawerClosedPlaying.getInstance());
}
@Override
public void stopButtonPushed()
}
}
DVDPlayer 类
public class DVDPlayer {
private DVDPlayer() {}
private static DVDPlayer player = null;
private State state;
public State getState() {
return state;
}
public static DVDPlayer getInstance(State stateParam) {
//making it singleton
if(player == null)
{
player = new DVDPlayer();
player.state = DrawerClosedNotPlaying.getInstance();
}
else
player.state = stateParam;
return player;
}
public void changeState(State newState) {
this.state=newState;
}
public State openCloseButtonPushed(){
state.openCloseButtonPushed();
return state;
}
public State playButtonPushed() {
state.playButtonPushed();
return state;
}
public State stopButtonPushed() {
state.stopButtonPushed();
return player.state;
}
public void open() {
System.out.println("DVDPlayer is opening.....");
}
public void close() {
System.out.println("DVDPlayer is closing.....");
}
public void play() {
System.out.println("DVDPlayer is playing.....");
}
public void stop() {
System.out.println("DVDPlayer is stopping.....");
}
}
结果:它会导致 StackOverflowError,因为它会不断初始化自身。请帮助如何使该测试成功通过。
java.lang.StackOverflowError
at DrawerOpen.<init>(DrawerOpen.java:5)
at DrawerOpen.getInstance(DrawerOpen.java:13)
at DrawerOpen.<init>(DrawerOpen.java:5)
at DrawerOpen.getInstance(DrawerOpen.java:13)
at DrawerOpen.<init>(DrawerOpen.java:5)
at DrawerOpen.getInstance(DrawerOpen.java:13)
at DrawerOpen.<init>(DrawerOpen.java:5)
at DrawerOpen.getInstance(DrawerOpen.java:13)
at DrawerOpen.<init>(DrawerOpen.java:5)
at DrawerOpen.getInstance(DrawerOpen.java:13)
at DrawerOpen.<init>(DrawerOpen.java:5)
at DrawerOpen.getInstance(DrawerOpen.java:13)
at DrawerOpen.<init>(DrawerOpen.java:5)
at DrawerOpen.getInstance(DrawerOpen.java:13)
at DrawerOpen.<init>(DrawerOpen.java:5)
at DrawerOpen.getInstance(DrawerOpen.java:13)
at DrawerOpen.<init>(DrawerOpen.java:5)
【问题讨论】:
-
"使其成为单例" 您实际上并不能保证这些是单例,除非您仅在单线程代码中使用它。
-
确实我需要一个单线程模型。因为资源 DVDPlayer 无法处理多线程模型。
标签: java junit static singleton stack-overflow