Есть ли способ переопределить getDescription () в io.cucumber.junit.Cucumber. java после 5.0.0? - PullRequest
1 голос
/ 23 марта 2020

Я пытаюсь поднять существующий проект с 3.0.2 до 5.5.0. У проекта есть пользовательская реализация getDescription () в классе бегуна Cucumber. java, и функциональность должна поддерживаться, поскольку она имеет зависимости в других проектах. Версия JUnit: 4.12.

. В версии 3.0.2 класс бегуна Cucumber. java определен в cucumber.api.junit.Cucumber как

public class Cucumber extends ParentRunner<FeatureRunner>
* 1007. * что делает пользовательского бегуна довольно простым:
public class DescriptiveCucumberRunner extends Cucumber
{
    public DescriptiveCucumberRunner(Class<?> testClass) throws InitializationError, IOException
    {
        super(testClass);
    }

    @Override
    public Description getDescription()
    {
        String text = "Cucumber tests running on " + new Date();
        Description originalDescription = super.getDescription();
        Description newDescription = originalDescription.childlessCopy();
        newDescription.addChild(Description.createSuiteDescription(text));

        for(Description childDescription : originalDescription.getChildren())
        {
            newDescription.getChildren().get(0).addChild(childDescription);
        }
        return newDescription;
    }
}

В 5.0.0 класс бегуна Cucumber. java был перемещен в io.cucumber.junit.Cucumber и определение было изменено на

public final class Cucumber extends ParentRunner<ParentRunner<?>>

, поэтому я больше не могу расширять.

Я пытался расширить org.junit.runners.ParentRunner

public class DescriptiveCucumberRunner extends ParentRunner<Cucumber>

и агрегирование с делегатом, но поскольку методы Cucumber. java защищены, мне, по сути, пришлось бы скопировать весь класс, чтобы сохранить текущие функциональные возможности, что на самом деле не было бы решением вообще. Я мог бы использовать рефлексию для вызова методов, определенных в Cucumber. java, но это тоже не совсем понятно.

Кто-нибудь знает, как это сделать, не требуя изменений в других проектах? Может быть, есть намеренный способ сделать это с огурцом, который я не замечаю? Надеюсь, мне просто не хватает очевидного решения, но пока я рисую пробел.

1 Ответ

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

Обычно предпочтительнее использовать композицию, а не наследование. Поэтому вместо расширения существующего класса бегуна Cucumber вы можете рассмотреть возможность реализации собственного класса бегуна, в котором экземпляр бегуна Cucumber является одним из его дочерних элементов.

package com.example;

import io.cucumber.junit.Cucumber;
import org.junit.runner.Description;
import org.junit.runner.notification.RunNotifier;
import org.junit.runners.ParentRunner;
import org.junit.runners.model.InitializationError;

import java.util.ArrayList;
import java.util.List;

public class MyCustomRunner extends ParentRunner<Cucumber> {

    private final List<Cucumber> children = new ArrayList<>(1);

    protected MyCustomRunner(Class<?> testClass) throws InitializationError {
        super(testClass);
        this.children.add(new Cucumber(testClass));
    }

    @Override
    public Description getDescription() {
        return // your custom description;
    }

    @Override
    protected List<Cucumber> getChildren() {
        return children;
    }

    @Override
    protected Description describeChild(Cucumber child) {
        return child.getDescription();
    }

    @Override
    protected void runChild(Cucumber cucumber, RunNotifier runNotifier) {
        cucumber.run(runNotifier);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...