Рубрики
Без рубрики

Издевательский частный статический итоговый журнал

Тесты для ведения журнала – это то, чего я старался избегать в прошлом. Сегодня мне пришлось написать какой-то код, который… Помеченный java, тестирование.

Тесты для ведения журнала – это то, чего я старался избегать в прошлом. Сегодня мне пришлось написать некоторый код, который экспортирует TestRail результаты для splunk и я был полон решимости проверить результат.

Вместо того, чтобы искать, как это сделать, используя jmock или mockito (так как это не работало для меня в прошлом) Я решил сам попробовать использовать отражение. Я искал “отражение java изменяет частное статическое поле” и наткнулся на это сообщение в stackoverflow. В сообщении показан способ изменения значения общедоступного статического конечного поля. Есть некоторые предостережения, но в случае Регистратора это работает.

Объединив эту информацию с mockito, я смог смоделировать регистратор для класса и проверить вывод журнала. Первый настройка теста (junit 4.13):

@RunWith(MockitoJunitRunner.class)
public class SplunkReporterMethods {
  @Mock private Logger log;
  private SplunkReporter reporter;

  @Test
  public void report() {
    reporter.report(new Car());
    then(log).should().info("{\"name\":\"car\",\"speed\":4}");
  }
}

Чтобы настроить класс Splunk Reporter с другим регистратором, макет необходимо ввести в частное статическое конечное поле. Это можно сделать с помощью метода @Перед .

@Before
void setup() {
  //allow log field to be changed
  Field field = SplunkReporter.class.getDeclaredField("log");
  field.setAccessible(true);

  //remove final modifier
  Field modifiersField = Field.class.getDeclaredField("modifiers");
  modifiersField.setAccessible(true);
  modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);

  //set to mock object
  field.set(null, log);
  reporter = new SplunkReporter();
}

Во-первых, метод настройки делает log доступным, но этого недостаточно. Модификаторы в поле необходимо изменить, чтобы удалить final . Класс Field не имеет задатчика для поля модификаторов, поэтому модификаторы необходимо установить в поле с помощью отражения. Наконец, статическое поле устанавливается в макет объекта.

Оригинал: “https://dev.to/moaxcp/mocking-private-static-final-log-1fh9”