【发布时间】:2013-09-20 13:19:13
【问题描述】:
我想用以下方法测试单例类的行为:
public class SomeSingleton
{
private final static int DEFAULT_VALUE1 = ...;
private final static int DEFAULT_VALUE2 = ...;
private static SomeSingleton instance;
public static void init(int value1, int value2)
{
if (instance != null)
{
throw new IllegalStateException("SomeSingleton already initialized");
}
instance = new SomeSingleton(value1, value2);
}
public static getInstance()
{
if (instance == null)
{
init(DEFAULT_VALUE1, DEFAULT_VALUE2);
}
return instance;
}
}
然后我有一个包含几个测试方法的测试类,它会多次调用init:
@RunWith(PowerMockRunner.class)
@PrepareForTest(SomeSingleton.class)
public class SomeSingletonTest {
@Test
public void testGetInstanceSunnyDay()
{
[...]
SomeSingleton.init(...);
[...]
SomeSingleton.getInstance();
[...]
}
@Test
public void testGetInstanceRainyDay()
{
[...]
SomeSingleton.init(...); // IllegalStateException
[...]
SomeSingleton.getInstance();
[...]
}
}
当我这样做时,我总是在第二次测试中得到IllegalStateException,因为instance != null。
如何在一个测试类中运行涉及init 的多个测试?
将testGetInstanceSunnyDay 和testGetInstanceRainyDay 放在2 个单独的类中可以解决问题,但我想知道是否有更好的解决方案。
【问题讨论】:
-
你认为单例在这里提供了什么好处,比如说,一个不可变的类不会?
-
单例是旧代码库的一部分。我没写。现在,我只想在单元测试中捕捉遗留代码的行为。然后逐步改进应用程序的设计。
标签: java unit-testing junit singleton