java - 是否有能够重用 Given, Then 的 BDD java 框架? (具有不同的 When 步骤)

标签 java unit-testing integration-testing bdd

我正在寻找可以重用 Given & Then 进行单元和集成测试的 BDD java 框架。

换句话说 1. 给定一些先决条件。 2. 何时 - 取决于环境 3. Then验证When

的结果

我希望能够通过更改 When 并保持 GivenThen 完整,更改测试类型,例如在简单的 REST 服务中:

  1. 单元测试
    • 给予
      • 生成一些 POJO 对象
    • 何时
      • Given 接收 POJO
      • 使用此 POJO 调用内部服务
      • 从服务接收 POJO 形式的结果
      • 将收到的 POJO 转发给 Then
    • 然后
      • When
      • 验证POJO
  2. 整合测试
    • 给予
      • 生成一些 POJO 对象
    • 何时
      • Given 接收 POJO
      • 以外部服务格式加密 POJO
      • 调用外部服务
      • 从暴露的服务接收外部服务格式的结果
      • 在 POJO 中转换接收到的结果
      • 将收到的 POJO 转发给 Then
    • 然后
      • When
      • 验证POJO

因此,在示例中,GivenThen 的行为方式相同,对于集成测试和单元测试,只需更改 When the scope of the test goes从单元到集成

有人能指出我正确的方向吗?

我不想重新发明轮子

最佳答案

免责声明:我是 JGiven 的作者。

JGiven正是提供了这一点。它是 Java 的 BDD 框架,其中场景由所谓的阶段类构建。对于您的示例,您需要四个阶段类:GivenInput、WhenInternalService、WhenExternalService 和 ThenOutput。然后你可以写两个测试:

内部服务的单元测试:

public class InternalServiceTest extends 
       ScenarioTest<GivenInput, WhenInternalService, ThenOutput> {

    @Test
    public void internal_service_works_as_expected() {
       given().some_input();
       when().the_internal_service_is_called();
       then().the_result_is_correct();
    } 
}

对外服务的集成测试:

public class ExternalServiceTest extends 
       ScenarioTest<GivenInput, WhenExternalService, ThenOutput> {

    @Test
    public void external_service_works_as_expected() {
       given().some_input();
       when().the_external_service_is_called();
       then().the_result_is_correct();
    } 
}

阶段类看起来像这样:

public class GivenInput extends Stage<GivenInput> {
    @ProvidedScenarioState
    InputPojo input;

    public GivenInput some_input() {
       input = new InputPojo();
       return self();
    }
}

public class WhenInternalService extends Stage<WhenInternalService> {
    @ExpectedScenarioState
    InputPojo input;

    @ProvidedScenarioState
    OutputPojo output;

    public WhenInternalService the_internal_service_is_called() {
        output = new InternalService().invoke(input);
        return self();
    }
}

public class WhenExternalService extends Stage<WhenExternalService> {
    @ExpectedScenarioState
    InputPojo input;

    @ProvidedScenarioState
    OutputPojo output;

    public WhenExternalService the_external_service_is_called() {
        ExternalInput externalInput = transformToExternal(input);
        ExternalOutput externalOutput = new ExternalService().invoke(external);
        output = transformToInternal(externalOutput);
        return self();
    }
}

public class ThenOutput extends Stage<ThenOutput> {
    @ExpectedScenarioState
    OutputPojo output;

    public ThenOutput the_result_is_correct() {
        assertThat(output).isNotNull();
        return self();
    }
}

请注意,步骤方法以流畅的界面风格编写,以便能够链接多个条件(尽管在您的示例中不需要)。

关于java - 是否有能够重用 Given, Then 的 BDD java 框架? (具有不同的 When 步骤),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14827145/

相关文章:

java - 如何将 C 变量 (JNI) 存储到 Java 类实例

android - 如何避免 Android 测试应用程序中的代码重复?

c++ - 测试使用协作者和模板化方法的类

java - 非法参数异常 : No visible constructors in class TestDatabaseAutoConfiguration$EmbeddedDataSourceFactoryBean

java - 如果测试失败,如何配置 testcontainers 以保持数据库容器运行?

c# - 使用 MassTransit 集成测试微服务

java - Android 二进制 xml 文件错误膨胀类/无法调用回收的实例

java - 重写的 @PostConstruct 在 CDI View 范围 bean 上调用了两次(Weld、Seam 3)

java - 无法使用spring boot将数据保存到数据库

Java Inflate 与大字符串不一致