Jbehave get Story name inside @BeforeStory

こ雲淡風輕ζ 提交于 2019-12-12 15:34:53

问题


I would like to get the Story name in a method annotated with @BeforeStory.

I need this for debugging purposes, cause i'm running a bunch of stories with runStoriesAsPaths and with multiple threads, and I'm trying to log wich thread is running wich story.

There is a way to do this?

THanks in advance.


回答1:


first you need to create a new StoryReporter (extend that class). In that class you can add actions to be performed before/after story/scenario/step, and you have the story name. example:

public class NewStoryReporter implements StoryReporter {

private StoryReporter delegate;

public NewStoryReporter(StoryReporter delegate) {
    this.delegate = delegate;
}

@Override
public void beforeStory(Story story, boolean givenStory) {
    delegate.beforeStory(story, givenStory);
}

@Override
public void beforeScenario(String scenarioTitle) {
    delegate.beforeScenario(scenarioTitle);
}

@Override
public void beforeStep(String step) {
    if(step.equals("When after each step")){
        return;
    }
    delegate.beforeStep(step);
}

then you need to extend StoryReporterBuilder, this creates your NewStoryReporter. example:

public class NewStoryReporterBuilder extends StoryReporterBuilder {

@Override
public StoryReporter build(String storyPath) {
    StoryReporter delegate = super.build(storyPath);
    return new NewStoryReporter(delegate);
}

}

then in your configuration, create an instance of the NewStoryReporterBuilder, and use it in

Configuration configuration = new YourConfiguration().useStoryReporterBuilder(newStoryReporterBuilder....)



回答2:


Now in Jbehave it's configured in different way.

So, to achieve that goal you need to:

  1. Create new class which extends org.jbehave.core.reporters.ConsoleOutput. Here you can modify various of methods. In your case - you need to override method:

    public void beforeScenario(String title)
    

    Check example attached in the end of this post to see how it can be done.

  2. Create new instance of abstract class org.jbehave.core.reporters.Filter:

    public static final Format YOUR_CUSTOM_CONSOLE = new Format("YOUR_CUSTOM_CONSOLE")
    {
        @Override
        public StoryReporter createStoryReporter(FilePrintStreamFactory factory,
                StoryReporterBuilder storyReporterBuilder) {
            return new TeamCityConsoleOutput(storyReporterBuilder.keywords()).doReportFailureTrace(
                    storyReporterBuilder.reportFailureTrace()).doCompressFailureTrace(
                    storyReporterBuilder.compressFailureTrace());
        }
    };
    
  3. Then you need to add this format to your story builder which you are using in your configuration, that mean:

    new MostUsefulConfiguration()
                .useStoryReporterBuilder(
                        new StoryReporterBuilder()
                                ....//here are another modifications of sorey report builder
                                .withFormats(YOUR_CUSTOM_CONSOLE , .../* another formats */ HTML, Format.XML, Format.TXT))
                ....//here are another modifications of configuration
                .useStepMonitor(new CrossReference().getStepMonitor());
    

Here is example of such modification, which can be used to integration with TeamCity: https://github.com/jbehave/jbehave-core/blob/d15774bf763875662869cdc89ce924b1086af6f8/jbehave-core/src/main/java/org/jbehave/core/reporters/TeamCityConsoleOutput.java



来源:https://stackoverflow.com/questions/16698425/jbehave-get-story-name-inside-beforestory

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!