Используя отражение, чтобы проникнуть во внутренности фреймворка, вы зависите от деталей реализации. Это плохая практика, когда когда фреймворк меняет свою реализацию, ваш код может сломаться.
Хуки в Cucumber предназначены для манипулирования контекстом выполнения теста до и после сценария. Они не созданы для того, чтобы сообщать о выполнении самого теста. Составление отчетов является сквозной задачей и лучше всего управляется с помощью системы плагинов.
Например:
package com.example;
import io.cucumber.plugin.ConcurrentEventListener;
import io.cucumber.plugin.event.EventPublisher;
import io.cucumber.plugin.event.Result;
import io.cucumber.plugin.event.Status;
import io.cucumber.plugin.event.TestCase;
import io.cucumber.plugin.event.TestCaseFinished;
public class MyTestListener implements ConcurrentEventListener {
@Override
public void setEventPublisher(EventPublisher publisher) {
publisher.registerHandlerFor(TestCaseFinished.class, this::handleTestCaseFinished);
}
private void handleTestCaseFinished(TestCaseFinished event) {
TestCase testCase = event.getTestCase();
Result result = event.getResult();
Status status = result.getStatus();
Throwable error = result.getError();
String scenarioName = testCase.getName();
String id = "" + testCase.getUri() + testCase.getLine();
System.out.println("Testcase " + id + " - " + status.name());
}
}
При использовании JUnit 4 и TestNG вы можете активировать этот плагин с помощью:
@CucumberOptions(plugin="com.example.MyTestListener")
С JUnit 5 вы добавляете его в junit-platform.properties
:
cucumber.plugin=com.example.MyTestListener
Или, если вы используете CLI
--plugin com.example.MyTestListener