我正在使用看起来(有点)像这样的枚举单例:
public enum mySingleton{
INSTANCE;
private static String myDrink = null;
public String getMyDrink(boolean isWizard)
{
if (myDrink == null)
{
if (isWizard)
myDrink = "Butterbeer";
else
myDrink = "Whiskey";
}
return myDrink;
}
//Some more functionality
//...
}
现在,为了测试这个单例,我有一些使用它的测试。但是由于所有测试在同一线程中一个接一个地运行,因此一旦我运行了第一个测试,就为所有其他测试设置了
myDrink
。我不喜欢
我在考虑使用
@After
函数并使用反射将myDrink
设置为null。我尝试了这个:
Field f = mySingleton.class.getField("myDrink");
f.setAccessible(true);
f.set(String.class, null);
但是我得到一个
java.lang.NoSuchFieldException
。怎么做到呢?
最佳答案
myDrink
字段不能为静态。使其成为非静态字段,然后使用
f.set(mySingleton.INSTANCE, null);
另外,使用
getDeclaredField
代替getField
。 getField
查找公共字段。如果您不能将其更改为非静态,则第一个参数将被忽略,因此只需使用
f.set(null, null);