Тесты для ведения журнала – это то, чего я старался избегать в прошлом. Сегодня мне пришлось написать некоторый код, который экспортирует 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”