Java 非常简单的一步一步 JBehave 设置教程?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/20733703/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-13 03:54:08  来源:igfitidea点击:

Very simple step by step JBehave setup tutorial?

javaeclipsejunitbddjbehave

提问by Will Marcouiller

Though I have read many, but many articles on how to use JBehave, I can't get it to work. Here are the steps I went through so far:

虽然我已经阅读了很多关于如何使用 JBehave 的文章,但我无法让它工作。以下是我到目前为止所经历的步骤:

  1. Created new Java Project
  2. Downloaded JBehave JAR file version 3.6.8 and added it to my build path libraries
  3. Created a package called com.wmi.tutorials.bdd.stack.specsunder the test source folder in my workspace
  4. Added the JBehave JAR file to my Build path Library configuration
  5. Created a JBehave story in the above-mentioned package (StackBehaviourStories.story)
  6. Created a Java class in the above-mentioned package (StackBehaviourStory.java)
  7. Created a Java class in the above-mentioned package (StackBehaviourSteps.java)
  8. Imported the Given, Named, Then, When annotations in my Java class
  9. Written two different scenarios in my JBehave story file
  1. 创建了新的 Java 项目
  2. 下载 JBehave JAR 文件版本 3.6.8 并将其添加到我的构建路径库中
  3. com.wmi.tutorials.bdd.stack.specs在我的工作区中的测试源文件夹下创建了一个包
  4. 将 JBehave JAR 文件添加到我的构建路径库配置中
  5. 在上述包(StackBehaviourStories.story)中创建了一个JBehave故事
  6. 在上述包(StackBehaviourStory.java)中创建了一个Java类
  7. 在上述包(StackBehaviourSteps.java)中创建了一个Java类
  8. 在我的 Java 类中导入了 Given, Named, Then, When 注释
  9. 在我的 JBehave 故事文件中写了两个不同的场景

And still, I can't get it to work/run! =(

而且,我仍然无法让它工作/运行!=(

The story file:

故事档案:

Narrative:
In order to learn to with JBehave using Eclipse
As a junior Java developer though senior in .Net and in BDD
I want to define the behaviour of a custom stack

Scenario: I push an item onto the stack
Given I have an empty stack
When  I push an item 'orange'
Then  I should count 1

Scenario: I pop from the stack
Given I have an empty stack
When  I push an item 'apple'
And   I pop the stack
Then  I should count 0

The story class

故事课

package com.wmi.tutorials.bdd.stack.specs

import org.jbehave.core.configuration.MostUsefulConfiguration;
import org.jbehave.core.junit.JUnitStory;

public class StackBehaviourStory extends JUnitStory {
    @Override 
    public Configuration configuration() { return new MostUsefulConfiguration(); }

    @Override
    public InjectableStepsFactory stepsFactory() {
        return new InstanceStepsFactory(configuration()
                                      , new StackBehaviourSteps());   
    }
}

The steps class

步骤类

package com.wmi.tutorials.bdd.stack.specs

import org.jbehave.core.annotations.Given;
import org.jbehave.core.annotations.Named;
import org.jbehave.core.annotations.Then;
import org.jbehave.core.annotations.When;
import org.jbehave.core.junit.Assert;

public class StackBehaviourSteps {
    @Given("I have an empty stack")
    public void givenIHaveAnEmptyStack() { stack = new CustomStack(); }

    @When("I push an item $item")
    public void whenIPushAnItem(@Named("item") String item) { stack.push(item); }

    @Then("I should count $expected")
    public void thenIShouldCount(@Named("expected") int expected) {
        int actual = stack.count();
        if (actual != expected) 
            throw new RuntimeException("expected:"+expected+";actual:"+actual);
    }
}

I'm currently using Eclipse Kepler (4.3) JEE with everything I need to use JUnit, Google App Engine, and yes, JBehave is installed correctly following the Eclipse JBehave installation tutorial.

我目前正在使用 Eclipse Kepler (4.3) JEE 以及使用 JUnit、Google App Engine 所需的一切,是的,按照 Eclipse JBehave 安装教程正确安装了 JBehave。

I can't get it to work. So how can I make it work correctly using Eclipse, JBehave and JUnit?

我无法让它工作。那么如何使用 Eclipse、JBehave 和 JUnit 使其正常工作呢?

采纳答案by Will Marcouiller

Following step by step closely the jbehave Getting Startedtutorial, the Run storysection says: [...] the ICanToggleACell.java class will allow itself to run as a JUnit test.

紧跟jbehave Getting Started教程一步一步,运行故事部分说:[...] ICanToggleACell.java 类将允许自己作为 JUnit 测试运行。

This means that the JUnit library is required in your Build path.

这意味着您的构建路径中需要 JUnit 库。

Using Eclipse:

使用 Eclipse:

  1. Select your current project and right-click it, Build path, Configure Build Path...
  2. Properties for [current project], Java Build Path, Libraries, click [Add Library...]
  3. Add Library, select JUnit, click [Next]
  4. JUnit Library, JUnit library version, select the version you wish to use, click [Finish]
  5. Java Build Path, click [OK]
  6. Project Explorer, select your ICanToggleACell.javaclass, right-click it, then Run As, and click on JUnit Test
  1. 选择您当前的项目并右键单击它,Build pathConfigure Build Path...
  2. [当前项目]Java 构建路径库的属性,单击[添加库...]
  3. 添加库,选择JUnit,点击【下一步】
  4. JUnit Library,JUnit库版本,选择你要使用的版本,点击【Finish】
  5. Java Build Path,点击【确定】
  6. 项目资源管理器,选择您的ICanToggleACell.java类,右键单击它,然后运行为,然后单击 JUnit 测试

So this is the same here as for the above-example code. The StackBehaviourStory.javaclass should let itself run as a JUnit test after you add the proper library to the Java build path.

所以这与上面的示例代码相同。StackBehaviourStory.java在您将适当的库添加到 Java 构建路径后,该类应该让自己作为 JUnit 测试运行。

回答by user3108681

In my case, I have extended my Steps class from Steps (from jbehave core)

就我而言,我已经从 Steps 扩展了我的 Steps 类(来自 jbehave 核心)

回答by David Holiday

I know I'm late to the party here but I'm posting because this is the info I wish I had a week ago as it would've saved me a lot of pain. I'm very much into the idea of BDD, but am unfortunately finding JBehave's docs to be a bit of a nightmare, especially when it comes to Maven integration. Moreover a lot of the code I found both on their website and elsewhere didn't work. Through trial and error, and lots of tutorials, I was able to piece together the following. It runs both in Maven and Eclipse, has a single binding class that maps stories to step files, and is able to find story files located in src/test/resources.

我知道我在这里参加聚会迟到了,但我发帖是因为这是我一周前希望得到的信息,因为它可以为我省去很多痛苦。我非常喜欢 BDD 的想法,但不幸的是,我发现 JBehave 的文档有点像一场噩梦,尤其是在 Maven 集成方面。此外,我在他们的网站和其他地方找到的很多代码都不起作用。通过反复试验和大量教程,我能够拼凑出以下内容。它在 Maven 和 Eclipse 中运行,有一个将故事映射到步骤文件的绑定类,并且能够找到位于 src/test/resources 中的故事文件。

here is a working pom file:

这是一个工作 pom 文件:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.projectvalis.st1</groupId>
  <artifactId>st1</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>st1</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <build>
    <pluginManagement>
      <plugins>

        <plugin>
      <artifactId>maven-compiler-plugin</artifactId>
        <version>2.3.2</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        <compilerArgument></compilerArgument>
          </configuration>
        </plugin>

       <plugin>  
         <groupId>org.apache.maven.plugins</groupId>  
         <artifactId>maven-failsafe-plugin</artifactId>  
         <version>${failsafe.and.surefire.version}</version>  
         <executions>  
           <execution>  
             <id>integration-test</id>  
             <goals>  
               <goal>integration-test</goal>  
               <goal>verify</goal>  
             </goals>  
           </execution>  
         </executions>  
         <configuration>  
           <includes>  
             <include>**/*Test.java</include>  
           </includes>  
         </configuration>  
       </plugin>

       <plugin>
        <groupId>org.jbehave</groupId>
        <artifactId>jbehave-maven-plugin</artifactId>
        <version>4.0.2</version>
            <executions>  
                <execution>  
                    <id>run-stories-as-embeddables</id>  
                    <phase>integration-test</phase>  
                    <configuration>  

                    <includes>  
                        <include>**/*Test.java</include>  
                    </includes>  
                    <ignoreFailureInStories>false</ignoreFailureInStories>  
                    <ignoreFailureInView>false</ignoreFailureInView>  

                        <systemProperties>
                            <property>
                                <name>java.awt.headless</name>
                                <value>true</value>
                            </property>
                        </systemProperties>


                    </configuration>  
                    <goals>  
                    <goal>run-stories-as-embeddables</goal>  
                    </goals>  
            </execution>  
             </executions>
       </plugin>

      </plugins>
    </pluginManagement>
  </build>


  <dependencies>

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>1.7.7</version>
    </dependency>

    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>1.0.1</version>
    </dependency>

    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-core</artifactId>
      <version>1.0.1</version>
    </dependency>

    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.4</version>
    </dependency>

    <dependency>
        <groupId>org.jbehave</groupId>
        <artifactId>jbehave-core</artifactId>
        <version>4.0.2</version>
    </dependency>

  </dependencies>
</project>

here is a sample story file

这是一个示例故事文件

Narrative:
In order to work with files to compress
As a guy who wants to win a bet with cameron
I want to ensure files are ingested and processed in the manner in which the
methods in the ingest class purport to process them. 

Scenario:  Simple test to give JBehave a test drive
Given a file, a.log
When the caller loads the file as a byte array
Then the byte array that is returned contains the correct number of bytes.

here is a sample step file

这是一个示例步骤文件

package com.projectvalis.compUtils.tests.ingest;

import java.io.File;

import org.jbehave.core.annotations.Given;
import org.jbehave.core.annotations.Named;
import org.jbehave.core.annotations.Then;
import org.jbehave.core.annotations.When;
import org.jbehave.core.steps.Steps;
import org.junit.Assert;

import com.projectvalis.compUtils.util.fileIO.Ingest;


    /**
     * BDD tests for the ingest class
     * @author funktapuss
     *
     */
    public class LoadByteSteps extends Steps {

        private String fNameS;
        private byte[] byteARR;

        @Given("a file, $filename")
        public void setFileName(@Named("filename") String filename) {
            File file = new File(getClass().getResource("/" + filename).getFile());
            fNameS = file.getPath();
        }

        @When("the caller loads the file as a byte array")
        public void loadFile() {
            byteARR = Ingest.loadFile(fNameS);
        }

        @Then("the byte array that is returned contains the "
                + "correct number of bytes.") 
        public void checkArrSize() {
            File file = new File(fNameS);
            Assert.assertTrue(
                    "loading error - "
                    + "the file and the resultant byte array are different sizes!", 
                    (long)byteARR.length == file.length());
        }


    }

and here is the generic runner

这是通用赛跑者

package com.projectvalis.compUtils.tests.runner;


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

import org.jbehave.core.configuration.Configuration;
import org.jbehave.core.configuration.MostUsefulConfiguration;
import org.jbehave.core.io.CodeLocations;
import org.jbehave.core.io.LoadFromClasspath;
import org.jbehave.core.io.StoryFinder;
import org.jbehave.core.junit.JUnitStories;
import org.jbehave.core.reporters.Format;
import org.jbehave.core.reporters.StoryReporterBuilder;
import org.jbehave.core.steps.InjectableStepsFactory;
import org.jbehave.core.steps.InstanceStepsFactory;
import org.jbehave.core.steps.Steps;

import com.projectvalis.compUtils.tests.ingest.LoadByteSteps;



/**
 * generic binder for all JBehave tests. Binds all the story files to the 
 * step files. works for both Eclipse and Maven command line build.  
 * @author funktapuss
 *
 */
public class JBehaveRunner_Test extends JUnitStories {

    @Override 
    public Configuration configuration() { 
        return new MostUsefulConfiguration()            
                .useStoryLoader(
                        new LoadFromClasspath(this.getClass().getClassLoader()))
                .useStoryReporterBuilder(
                        new StoryReporterBuilder()
                            .withDefaultFormats()
                            .withFormats(Format.HTML, Format.CONSOLE)
                            .withRelativeDirectory("jbehave-report")
                );
    }

    @Override
    public InjectableStepsFactory stepsFactory() {
        ArrayList<Steps> stepFileList = new ArrayList<Steps>();
        stepFileList.add(new LoadByteSteps());

        return new InstanceStepsFactory(configuration(), stepFileList);       
    }

    @Override
    protected List<String> storyPaths() {
       return new StoryFinder().
               findPaths(CodeLocations.codeLocationFromClass(
                       this.getClass()), 
                       Arrays.asList("**/*.story"), 
                       Arrays.asList(""));

    }

}

the runner lives in src/test/java//tests.runner. the ingest test lives in src/test/java//tests.ingest. the story files live in src/test/resources/stories.

runner 位于 src/test/java/ /tests.runner。摄取测试位于 src/test/java//tests.ingest。故事文件位于 src/test/resources/stories 中。

As far as I can tell, JBehave has LOTS of options, so this certainly isn't the only way of doing things. Treat this like a template that will get you up and running quickly.

据我所知,JBehave 有很多选择,所以这当然不是唯一的做事方式。将此视为可以让您快速启动和运行的模板。

full source is on github.

完整源代码在github 上

回答by Gunaseelan Ramalingam

i had updated the JunitStory to JunitStories and it worked

我已经将 JunitStory 更新为 JunitStories 并且它起作用了

public class StackBehaviourStory extends JUnitStory ---> JunitStories

公共类 StackBehaviourStory 扩展 JUnitStory ---> JunitStories