如何创建一个黄瓜java自定义格式器来获取黄瓜标签

时间:2018-08-24 12:38:40

标签: cucumber-jvm custom-formatting

我有一个黄瓜项目,我想在项目中获取所有标签,以便能够选择它们作为参数。

我发现了这个question,黄瓜可以选择获取标签,但是我发现它不再起作用了,然后我找到了另外一个question,在那里我需要一个自定义格式化程序我的标签,但它是用于ruby的,而Java需要它,因此我找到了如何创建自定义格式程序的article,但是我发现这适用于cukes版本,并且我正在使用一世。

因此,我在Cucumber包中进行了搜索,并从Cucumber.runtime.formatter包中的JSONFormatter副本创建了一个自定义格式器,这是我的代码:

import cucumber.api.TestCase;
import cucumber.api.event.*;
import cucumber.api.formatter.Formatter;
import cucumber.api.formatter.NiceAppendable;
import gherkin.deps.com.google.gson.Gson;
import gherkin.deps.com.google.gson.GsonBuilder;
import gherkin.pickles.PickleTag;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class TagsFormatter implements Formatter {

    private String currentFeatureFile;
    private final Gson gson = new GsonBuilder().setPrettyPrinting().create();
    private final NiceAppendable out;

    private List<String> tags = new ArrayList<>();


    private EventHandler<TestCaseStarted> caseStartedHandler = this::handleTestCaseStarted;

    private EventHandler<TestRunFinished> runFinishedHandler = event -> finishReport();

    public TagsFormatter(Appendable out) {
        this.out = new NiceAppendable(out);
    }

    @Override
    public void setEventPublisher(EventPublisher publisher) {
        publisher.registerHandlerFor(TestCaseStarted.class, caseStartedHandler);
        publisher.registerHandlerFor(TestRunFinished.class, runFinishedHandler);
    }

    private void handleTestCaseStarted(TestCaseStarted event) {
        if (currentFeatureFile == null || !currentFeatureFile.equals(event.testCase.getUri())) {
            currentFeatureFile = event.testCase.getUri();
            collectTags(event.testCase);
        }
    }

    private void finishReport() {
        out.append(gson.toJson(tags));
        out.close();
    }

    private void collectTags(TestCase testCase) {
        testCase.getTags();
        tags.addAll(testCase.getTags()
                .stream()
                .map(PickleTag::getName)
                .collect(Collectors.toList()));
    }    
}

我复制了在项目内部的lib文件夹中运行黄瓜所需的库,并尝试使用这样的格式化程序来运行它:

java -cp .\lib\cucumber-core-2.4.0.jar;.\lib\gherkin-5.0.0.jar;.\lib\cucumber-java-2.4.0.jar;.\lib\cucumber-jvm-deps-1.0.6.jar cucumber.api.cli.Main -p "com.myproject.formatters.TagsFormatter:tags.txt"

但是我正在获取一个类未找到异常:

λ java -cp .\lib\cucumber-core-2.4.0.jar;.\lib\gherkin-5.0.0.jar;.\lib\cucumber-java-2.4.0.jar;.\lib\cucumber-jvm-deps-1.0.6.jar cucumber.api.cli.Main -p "com.myproject.formatters.TagsFormatter:tags.txt"
Exception in thread "main" cucumber.runtime.CucumberException: Couldn't load plugin class: com.myproject.formatters.TagsFormatter
        at cucumber.runtime.formatter.PluginFactory.loadClass(PluginFactory.java:181)
        at cucumber.runtime.formatter.PluginFactory.pluginClass(PluginFactory.java:166)
        at cucumber.runtime.formatter.PluginFactory.getPluginClass(PluginFactory.java:223)
        at cucumber.runtime.formatter.PluginFactory.isFormatterName(PluginFactory.java:201)
        at cucumber.runtime.RuntimeOptions$ParsedPluginData.addPluginName(RuntimeOptions.java:471)
        at cucumber.runtime.RuntimeOptions.parse(RuntimeOptions.java:157)
        at cucumber.runtime.RuntimeOptions.<init>(RuntimeOptions.java:115)
        at cucumber.runtime.RuntimeOptions.<init>(RuntimeOptions.java:108)
        at cucumber.runtime.RuntimeOptions.<init>(RuntimeOptions.java:100)
        at cucumber.api.cli.Main.run(Main.java:31)
        at cucumber.api.cli.Main.main(Main.java:18)
Caused by: java.lang.ClassNotFoundException: com.myproject.formatters.TagsFormatter
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at cucumber.runtime.formatter.PluginFactory.loadClass(PluginFactory.java:174)
        ... 10 more

那么,如何以可识别的方式创建此格式化程序?还是至少从控制台获得了黄瓜的标签列表?

谢谢

1 个答案:

答案 0 :(得分:1)

仅查看您的代码,我认为它没有任何问题。但是,您的命令似乎没有在类路径中包含TagsFormatter的编译版本。

如果您的编译源位于.\bin\中,请确保包括该文件夹,即:

java -cp .\lib\cucumber-core-2.4.0.jar;.\lib\gherkin-5.0.0.jar;.\lib\cucumber-java-2.4.0.jar;.\lib\cucumber-jvm-deps-1.0.6.jar;.\bin\* cucumber.api.cli.Main -p "com.myproject.formatters.TagsFormatter:tags.txt"