Необратимые типы; не может привести 'io.cucumber. java .Scenario' к 'cucumber.runtime.ScenarioImpl' - PullRequest
0 голосов
/ 13 марта 2020

Я обновил свою версию Cucumber до 5.4.2, и этот кусок кода перестал работать из-за ошибки Inconvertible types; cannot cast 'io.cucumber.java.Scenario' to 'cucumber.runtime.ScenarioImpl'.

  Field field = FieldUtils.getField((scenario).getClass(), "stepResults", true); 

В любом случае, чтобы вернуть его к работе?

Это целый кусок кода согласно этой ТАКОЙ записи

private static String logError(Scenario scenario) {

    Field field = FieldUtils.getField((scenario).getClass(), "stepResults", true);

    if (field != null) {
        field.setAccessible(true);
        try {
            ArrayList<Result> results = (ArrayList<Result>) field.get(scenario);
            for (Result result : results) {
                if (result.getErrorMessage() != null)
                    if (result.getErrorMessage().length() >= 10000) {
                        return FAILED_COMMENT + "\n" + result.getErrorMessage().substring(0, 10000);
                    } else {
                        return FAILED_COMMENT + "\n" + result.getErrorMessage();
                    }
            }
        } catch (Exception e) {
            return FAILED_COMMENT;
        }
    }

    return FAILED_COMMENT;
}

Большое спасибо.

1 Ответ

0 голосов
/ 14 марта 2020

Используя отражение, чтобы проникнуть во внутренности фреймворка, вы зависите от деталей реализации. Это плохая практика, когда когда фреймворк меняет свою реализацию, ваш код может сломаться.

Хуки в 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 
...