Сброс синглтонового поля enum с помощью отражения - PullRequest
1 голос
/ 28 октября 2011

Я использую синглтон enum, который выглядит (несколько) так:

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 в ноль.

Я попробовал это:

Field f = mySingleton.class.getField("myDrink");
f.setAccessible(true);
f.set(String.class, null);

Но я получаю java.lang.NoSuchFieldException.

Как это можно сделать?

Ответы [ 4 ]

2 голосов
/ 28 октября 2011

Метод getField () может обращаться только к общедоступным полям.Попробуйте с getDeclaredFields ()

2 голосов
/ 28 октября 2011

Поле myDrink не должно быть статическим. Сделайте это нестатическое поле, а затем используйте

f.set(mySingleton.INSTANCE, null);

Также используйте getDeclaredField вместо getField. getField ищет открытые поля.

Если вы не можете изменить его на нестатический, то первый аргумент игнорируется, поэтому просто используйте

f.set(null, null);
1 голос
/ 28 октября 2011

Поскольку это используется только для целей тестирования, вы можете добавить пакетный локальный установщик.Тот, который обычно недоступен.

/* can only be called from tests in the same package */
void resetMyDrink() {
    myDrink = null;
}
1 голос
/ 28 октября 2011

Использовать ноль для первого аргумента в f.set (...) из javadocs Field.set ,

If the underlying field is static, the obj argument is ignored; it may be null.  

И, как сказал loodakawa, используйте getDeclaredField, поскольку myDrink является приватным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...