我正在使用看起来(有点)像这样的枚举单例:

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代替getFieldgetField查找公共字段。

如果您不能将其更改为非静态,则第一个参数将被忽略,因此只需使用

f.set(null, null);

10-07 20:33